Linux系统编程之进程退出,父进程等待子进程退出

1.首先讲一下进程的退出
进程的退出分为正常退出和异常退出:
正常退出:
(1)main函数调用return
(2)进程调用exit(),标准C库
(3)进程调用_exit()或_Exit(),属于系统调用
(4)进程最后一个线程返回
(5)最后一个线程调用pthread_exit

异常退出:
(1)调用abort
(2)当进程收到某些信号时,例如Ctrl+c
(3)最后一个线程对取消(cancellation)请求做出响应

Linux系统编程之进程退出,父进程等待子进程退出_第1张图片
Linux系统编程之进程退出,父进程等待子进程退出_第2张图片
Linux系统编程之进程退出,父进程等待子进程退出_第3张图片
以上三张图片是对进程退出的补充,
在第二第三张图中的exit(),_exit()_Exit(),这三个函数其实一样的,但习惯用exit()。exit相当于是_exit和_Exit的一个组合。

2.接下来我们介绍一下等待子进程退出以及为什么要等待子进程的退出
在之前我们没学习到等待子进程退出的时候,都是没做等待子进程的操作的,那么这样的子进程都是会变成僵尸进程的。
(1)父进程等待子进程的退出并收集子进程的退出状态,子进程的退出状态不被收集,子进程就会变成僵死进程(僵尸进程)。
Linux系统编程之进程退出,父进程等待子进程退出_第4张图片
介绍一下等待子进程的相关函数:
Linux系统编程之进程退出,父进程等待子进程退出_第5张图片
Linux系统编程之进程退出,父进程等待子进程退出_第6张图片
上图中的waip写错了,应该是wait,waitpid中的有一个选项,可以使调用者不阻塞的选项时options,
在这里插入图片描述
这里的阻塞就是相当于vfork方式创建子进程,父进程处于阻塞状态,让子进程先执行,当父进程收到子进程的退出信号的时候,父进程开始执行。而waitpid不阻塞的机制就有点像fork方式创建的子进程一样,父子进程交替执行,所以这就搞的以waitpid的方式等待有点多余了,所以等待子进程退出还是使用wait函数多,但也有场景需要用waitpid的,所以只是少用waitpid而已。

僵尸进程:Z+
正常进程:即有父进程等待的进程,S+
Linux系统编程之进程退出,父进程等待子进程退出_第7张图片
这里的11328就是正常进程,11329就是僵尸进程,有时候调用waitpid函数等待子进程的时候在linux 底下有时候子进程是僵尸进程,有时候又是正常的进程,这以自己跑起来相应的程序查看的为准,而调用wait等待子进程的时候,这时子进程是正常的进程。

(2)以wait函数等待子进程:
直接上代码:

#include 
#include 
#include 
#include 

int main()
{
   
        pid_t pid;
        int status;
        int cnt = 0;

        pid = fork();

        if(pid > 0)
        

你可能感兴趣的:(嵌入式软件工程师,linux,c语言)