wait/waitpid函数详解

#include<sys/types.h>
#include<sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
特殊参数和返回情况:
参数pid:
       >0 回收指定ID的子进程
       -1 回收任意子进程(相当于wait)
       0 回收和当前调用waitpid一个组的所有子进程
       < -1 回收指定进程组内的任意子进程
返回0:参数3为WNOHANG,且子进程正在运行。
若调用成功则返回清理掉的子进程的id,若调用出错则返回-1。父进程调用wait或者waitpid时可能会:
    1.阻塞(如果它的所有子进程都还在运行)
    2.带子进程的终止信息立即返回(如果一个子进程已终止,正等待父进程读取其终止信息)    
    3.出错立即返回(如果它没有任何子进程)
这两个函数的区别是:
    如果父进程的所有子进程都还在运行,调用wait将使父进程阻塞,而调用waitpid时如果在options参数中指定WNOHANG可以使父进程不阻塞而立即返回0
    wait等待第一个终止的子进程,而waitpid可以通过pid参数指定等待哪一个子进程
注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程需要用到循环
可见,调用wait和waitpid不仅可以获得子进程的信息,还可以使父进程阻塞等待子进程终止,起到进程间同步的作用。如果参数status不是空指针,则子进程的终止信息通过这个参数传出,如果只是为了同步而不关心子进程的终止信息,
可以将status参数指定为NULL

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    pid_t pid;
    pid = fork();
    if (pid < 0) 
    {
        perror("fork failed");
        exit(1);
    }
    if (pid == 0) 
    {
        int i;
        for (i = 3; i > 0; i--) 
        {
            printf("This is the child\n");
            sleep(1);
        }
        exit(3);
    } 
    else 
    {
        int stat_val;
        waitpid(pid, &stat_val, 0);
        if (WIFEXITED(stat_val))
            printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
        else if (WIFSIGNALED(stat_val))
            printf("Child terminated abnormally, signal %d\n", WTERMSIG(stat_val));
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值