进程等待

进程等待

  • 为什么要等待?

    1.子进程退出,如果父进程不管不顾,可能造成僵尸问题,造成内存泄漏

    2.一旦变成僵尸状态,kill -9都无能为力,因为没有谁可以杀死一个死去了的进程

    3.父进程需要知道子进程完成任务的情况(对错与否,有没有异常退出等)

    4.父进程需要通过进程等待的方式回收子进程的资源,获取退出信息

  • 怎么等待?(两个接口函数)

    wait系统调用

    
    #include<sys/types.h>
    
    
    #include<sys/wait.h>
    
    pid_t wait(int* status)

    参数:status输出型参数,整型指针,指向的空间存放的是子进程退出的状态,获取子进程状态,不关心可以设置为NULL

    返回值:pid_t类型,如果返回值大于0,说明等待成功,返回的是子进程的ID,可以通过status查看子进程的退出状态;如果返回值等于-1,则说明等待失败(可能wait的进程本身没有子进程)

    该方式为阻塞式等待,父进程什么都不做在等待子进程退出,如果没有子进程退出,父进程会一直等;如果父进程收到SIGCHLD信号,该函数就会立马返回立马清理。

    waitpid系统调用

    
    #include<sys/types.h>
    
    
    #include<sys/wait.h>
    
    pid_t waitpid(pid_t pid, int* status, int options)

    参数:pid表示要等待的是哪个进程,status仍然是个输出型参数,存放子进程的退出码,options是一个选项,如果options设置为0,那么这个函数就是阻塞式等待,如果设置为WNOHANG,则函数为非阻塞式等待(发现已经没有退出的子进程可以收集)

    返回值:返回值大于0,等待成功,返回子进程的id,返回值等于0,表示发现等待的子进程没有退出,返回值等于-1,调用失败

    如果参数pid设置为-1,则表示等待任意子进程,和wait等效

    wait和waitpid的区别?

    1. wait是阻塞式等待,waitpid可自行选择(options为0阻塞,options为WNOHANG为非阻塞)

    2. wait等待的是任意子进程(等到谁就是谁),waitpid等待的是参数pid传进来的确定子进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_长风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值