子进程的异步等待方式

等待:
等待有阻塞等待和非阻塞等待。
我们用非阻塞等待来实现异步。
1, 子进程终止时会给父进程发送SIGCHLD信号
2, 为了验证子进程在退出时确实向父进程发送了SIGCHLD信号,我们对SIGCHLD信号进行捕捉
3,

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
void handler(int child)
{
    printf("i had revieve sigal");
}
int main ()
{
    signal(SIGCHLD, handler);
    pid_t id = fork();   
    if (id == 0)
    {
        printf("i am child\n");
        sleep(2);
        exit(-1);
    }
    while (1)
    {
        sleep(1);
        printf("wait signal ...\n");
    }

    return 0;
}

4,
这里写图片描述
5, pid_t waitpid(pid_t pid, int *status, int options);
6,
pid = -1:等待任何一个子进程,与wait相同。
pid = 0:等待与调用者进程组id相同的任意子进程。

pid > 0:等待进程id与pid值相同的子进程。

pid < - 1:等待进程组id与pid绝对值相等的任意子进程。

7,参数option依具体值的不同含义:

WNOHANG:非阻塞式等待指定的进程。

WUNTRACED:如果子进程进入暂停执行则马上返回,但结束状态不予以例会。

WCONTINUED:若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但状态尚未报告,则返回状态。

8,

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

void handler(int sig)
{
    pid_t id;
    while ((id = waitpid(-1, NULL, WNOHANG)) > 0)
    {
        printf("father wait success!\n");
    }
    printf("chiild is quit! %d\n", getpid());
}


int main()
{
    signal(SIGCHLD, handler);
    pid_t pid1 = fork();

    if(pid1 == 0)
    {
        printf("i am child... one\n");
        sleep(3);
        exit(3);
    }
    pid_t pid2 = fork();
    if(pid2 == 0)
    {
        printf("i am child... two\n");
        sleep(2);
        exit(2);
    }

    pid_t pid3 = fork();
    if(pid3 == 0)
    {
        while(1)
        {
            sleep(1);
            printf("i am three child, i am working!\n");
        }
    }   

    while (1)
    {
        sleep(1);
        printf("father \n");
    }
    return 0;
}

9,
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值