进程控制
进程终止
在编写 C 语言程序时,main 函数往往会 return 0;但是为什么需要 return 0 呢?return 的 0 被谁接收了呢?首先 main 函数的返回值是退出码,往往用 0 表示运行成功正常退出,非零值表示失败,不同的退出码表示不同的失败原因。main 函数的退出码是直接被操作系统接收的,用来让操作系统辨别该进程的执行情况,子进程的退出码则由父进程接收。
在 Linux 中我们使用命令 echo $? 可以显示出最近一个进程的退出码,C 语言已经提供了一些内置的错误原因。

使用函数 strerror 可以显示该错误码对应的错误信息。

进程终止无外乎三种情况:
- 代码跑完,结果对
- 代码跑完,结果不对
- 代码没跑完,进程异常
对于前两种情况的区分是由退出码来决定的,而如果代码出现异常,那么退出码本身是没有意义的。 退出码有三种方法表示:
- main 函数进行
return n,n 为退出码 - 直接调用
exit(n),n 为退出码 - 直接调用
_exit(n)
三种方法的比较
return VS exit
return 表示函数调用结束,main 函数 return 表示进程退出,exit 表示进程结束,任何地方调用都会导致进程退出。
exit VS _exit
exit 是库函数会主动刷新缓冲区,而 _exit 是系统调用不会刷新缓冲区,所以 exit 底层是有 _exit 的。而由此我们可以知道输出缓冲区一定不在操作系统内部,因为倘若在,那么 _exit 也会刷新缓冲区,由此可以得知输出缓冲区是在库当中的,也就是库缓冲区。
所以进程退出的最佳实践为 exit。
进程等待
为什么要等待进程?
子进程退出,父进程如果不管不顾,就可能造成'僵尸进程'的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就无法被杀死,kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息,其中回收资源是父进程必须做的事,而获取子进程退出信息是可选的。
进程等待是让父进程通过等待的方式回收子进程的 PCB 与资源,如果需要就获取子进程的退出信息。

父进程调用 wait 函数表示等待任意一个子进程,如果子进程没有退出,父进程等待时就会阻塞,如果子进程退出,父进程 wait 时,wait 就会返回,让系统自动解决子进程的僵尸问题,等待成功时返回子进程的 pid。
waitpid
pid_t ;








