进程学习5--父进程wait回收子进程

概述

wait的工作原理
(1)子进程结束时,系统向其父进程发送SIGCHILD信号
(2)父进程调用wait函数后阻塞
(3)父进程被SIGCHILD信号唤醒然后去回收僵尸子进程
(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程。
(5)若父进程没有任何子进程则wait返回错误

正文

函数

函数原型wait

pid_t wait(int *status);

参数

参数status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。
WIFEXITED、WIFSIGNALED、WEXITSTATUS这几个宏用来获取子进程的退出状态。
WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)
WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)
WEXITSTATUS宏用来得到正常终止情况下的进程返回值的。

返回值

返回本次回收的子进程的PID号

测试代码

int main(void)
{
    pid_t Mypid  =-1;

    Mypid = fork();
    if(Mypid>0)/*父进程*/
    {
        pid_t Mypid2 = -1;
        int status = -1;

        Mypid2 = wait(&status);/*阻塞*/
        printf("son is recycled Mypid2 = %d\r\n",Mypid2);
        printf("exit true? %d\n", WIFEXITED(status));
        printf("exit false? %d\n", WIFSIGNALED(status));
        printf("exit val %d.\n", WEXITSTATUS(status));
    }
    else if(Mypid == 0)/*子进程*/
    {
        printf("son progress.Mypid = %d\r\n",getpid());
        return 22;
    }

    return 0;
}
/************运行结果****************
    son progress.Mypid = 10558
    son is recycled Mypid2 = 10558
    exit true? 1
    exit false? 0
    exit val 22.
************************************/

参考

朱老师Linux教程文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值