进程等待

进程等待:
(一)
pid-t wait(int* status);
参数:status为一个输出型参数,用于获得所等待进程的退出信息;
返回值:成功返回的是所等待进程的pid,大于0。
             失败返回-1.
(二)
pid_t waitpid(pid_t pid,int* status,int options) ;
参数:
pid 为所等待进程的pid;
status:所等待进程的退出信息;
option:设定等待的方式;
option = 0:   阻塞式等待
option = WNOHANG:  非阻塞式等待。
(三)
进程的异步等待:
父进程可以通过 wait 和waitpid函数对于子进程进行等待,可以以阻塞的方式等待,,也可以以非阻塞(轮询)的方式进行。但是这都会影响父进程的运行。

SIGCHLD信号:
子进程退出时会给父进程,发送SIGCHILD信号,父进程对于这种信号的操作为忽略,我们可以通过捕捉该信号,当子进程给父进程发送SIGCHILD时,父进程再去回收就可以了。

编写代码验证子进程退出时确实会给父进程发送SIGCHILD信号
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
void myhandler()
{
    printf("I get the SEMCHILD.\n");
}
int main()
{
    //捕捉SIGCHILD信号
    struct sigaction act,oact;
    act.sa_handler = myhandler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGCHLD,&act,&oact);
    
    //子进程
    int i = 0;
    pid_t id = fork();
    if(id == 0)
    {
        //child
        printf("pid = %d,ppid = %d\n",getpid(),getppid());
        exit(1);
    }
    while(1)
    {
        sleep(1);
        ++i;
        printf("  I am the parent process.%d\n",getpid());
    }
    return 0;
}
运行结果:

父进程对于子进程进行异步等待:
       确定了子进程退出时会给父进程发送SIGCHLD信号,父进程就不用以阻塞的或非阻塞(轮询)的方式,对于子进程进行等待;
父进程可以对于SIGCHLD进行捕捉,当有这个信号发来的时候进行处理就可以了。
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
static pro_num = 0;
void myhandler()
{
    pro_num++;
    pid_t wpid = waitpid(-1,NULL,WNOHANG);
    if(wpid > 0)
    {
        printf("the %d process is wait success.\n",pro_num);
    }
    else
    {
        printf("the %d process is wait failed.\n",pro_num);
    }
}
int main()
{
    //信号捕捉
    struct sigaction act,oact;
    act.sa_handler = myhandler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGCHLD,&act,&oact);
    //创建子进程
    pid_t pid1 = fork();
    if(pid1 == 0)
    {
        exit(1);
    }
    pid_t pid2 = fork();
    if(pid2 == 0)
    {
        sleep(1);
        exit(1);
    }
    pid_t pid3 = fork();
    if(pid3 == 0)
    {
        sleep(2);
        exit(1);
    }
    pid_t pid4 = fork();
    if(pid4 == 0)
    {
        sleep(10);
        exit(1);
    }
    while(1)
    {}
    return 0;
}
运行结果:
 



好了,就说这么多,以后大家要进程等待就有三种方法啦。微笑
作者水平有限,若有问题,请留言,谢谢!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值