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

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上三张图片是对进程退出的补充,
在第二第三张图中的exit(),_exit()_Exit(),这三个函数其实一样的,但习惯用exit()。exit相当于是_exit和_Exit的一个组合。

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

僵尸进程:Z+
正常进程:即有父进程等待的进程,S+
在这里插入图片描述
这里的11328就是正常进程,11329就是僵尸进程,有时候调用waitpid函数等待子进程的时候在linux 底下有时候子进程是僵尸进程,有时候又是正常的进程,这以自己跑起来相应的程序查看的为准,而调用wait等待子进程的时候,这时子进程是正常的进程。

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

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

        pid = fork();

        if(pid > 0
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值