waitpid() 的返回值的 3 种情况

waitpid() 的返回值的 3 种情况:

1) 当正常返回的时候,waitpid() 返回收集到的已经回收子进程的进程号;、

2) 如果设置了选项 WNOHANG,

1.而调用中 waitpid() 发现没有已退出的子进程可等待,则返回 0;

2. 如果调用中出错,则返回-1,这时 errno 会被设置成相应的值以指示错误所在如:当 pid 所对应的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid() 就会出错返回,这时 errno 被设置为 ECHILD;

pid_t waitpid(pid_t pid, int *status, int options);

功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。

参数 pid 的值有以下几种类型:

1.pid > 0 等待进程 ID 等于 pid 的子进程。

2.pid = 0 等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,

waitpid 不会等待它。3.pid = -1 等待任一子进程。

3.pid < -1 等待指定进程组中的任何子进程,这个进程组的 ID 等于 pid 的绝对值。

status : 进程退出时的状态信息

options : options 提供了一些额外的选项来控制 waitpid()。

0:阻塞父进程,等待子进程退出。

WNOHANG:没有任何已经结束的子进程,则立即返回。

WUNTRACED:如果子进程暂停了则此函数马上返回,并且不予以理会子进程的结束状态。

#include <stdio.h>
#include <unistd.h>
#include<sys/wait.h>
#define N 3
int  main(int argc, const char** argv) {

    int i;
    for ( i = 0; i < N; i++)
    {
        __pid_t pid = fork();
        if (pid==0)
        {
            break;//防止子进程创建孙进程
        }
    }
    if (i == 0) // 子进程1
    {
        int j = 8;
        for (; j >0; j--)
        {
            printf("子进程%d剩余时间%ds\n", getpid(), j);
            sleep(1);
        }
        _exit(-1);
    }
    else if (i==1)//子进程2
    {
        int j = 3;
        for (; j >0; j--)
        {
            printf("子进程%d剩余时间%ds\n", getpid(), j);
            sleep(1);
        }
        _exit(-1);
    }
    else if (i==2)//子进程3
    {
        int j = 5;
        for (; j >0; j--)
        {
            printf("子进程%d剩余时间%ds\n", getpid(), j);
            sleep(1);
        }
        _exit(-1);
    }
    else if (i==N)//父进程
    {
        while (1)
        {
            __pid_t pid = waitpid(-1, NULL, WNOHANG);
            if(pid>1)
            {
                printf("子进ID:%d程退出了\n", pid);
            }
            else if (pid==0)//还有子进程进行
            {
                continue;               
            }
            else if(pid==-1)
            {
                break;
            }
        }
    }
    while (1)
        ;

        return 0;
 }
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值