进程控制

  1. fork()执行完之后,返回值为什么父进程和子进程的pid变量会不同返回值?

当 fork() 被调用时,操作系统会创建一个与父进程几乎相同的子进程,子进程会从 fork() 返回的位置开始执行。

在子进程中,fork() 返回值为 0,表示它是新创建的进程。

在父进程中,fork() 返回子进程的 PID,表示它是父进程,并且有能力管理子进程。

  1. 进程退出有三种:
  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止
  1. printf的数据存在缓冲区内,exit()终止进程会主动刷新缓存区,_exit()不会刷新缓冲区。

  2. 回收子进程的资源(防止僵尸进程)
    当子进程结束时,操作系统不会立即释放它占用的资源(如退出状态等),直到父进程调用 wait() 或相关函数来获取子进程的状态。如果父进程没有及时调用 wait(),子进程虽然退出了,但仍然在系统中保留一些信息(如 PID 和退出状态),这种未完全释放的子进程被称为僵尸进程(Zombie Process)。

调用 wait() 的主要作用之一就是回收子进程的资源,防止子进程变成僵尸进程。父进程通过 wait() 可以:

  • 获取子进程的退出状态。
  • 从操作系统中移除子进程的条目,释放子进程占用的资源。
  1. 获取子进程的退出状态
    wait() 的另一个作用是获取子进程的退出码和终止状态。父进程通过 wait() 函数可以知道子进程是正常结束,还是由于某些错误或者信号被终止。

wait() 的返回值包含了子进程的退出信息。
使用宏 WIFEXITED(status) 可以判断子进程是否正常退出。
使用宏 WEXITSTATUS(status) 可以获取子进程的退出码。

posted @   zhudachang  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示