Linux waitpid用WNOHANG

waitpid函数在Linux中用于等待子进程结束,当设置WNOHANG选项时,若无子进程退出则返回0。本文通过示例代码解释waitpid在不同情况下的返回值,并展示了一个使用WNOHANG的父进程不断检查子进程状态的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

waitpid的返回值比wait稍微复杂一些,一共有3种情况:

1. 当正常返回的时候,waitpid返回收集到的子进程的进程ID;
2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;

下面看一个简单的例子:
下载: waitpid.c

   1. /* waitpid.c */
   2. #include <sys/types.h>
   3. #include <sys/wait.h>
   4. #include <unistd.h>
   5. #include <stdio.h>
   6.
   7. int main()
   8. {
   9.     pid_t pc, pr;
  10.
  11.     pc = fork();
  12.     if ( pc < 0 ) /* fork错误*/
  13.     {
  14.         printf("fork error\n");
  15.         exit(1);
  16.     }
  17.     else if ( pc == 0 ) /*在子进程中*/
  18.     {
  19.         sleep(10);
  20.         exit(0);
  21.     }
  22.     else
  23.     {
  24.         do {/* 使用了WNOHANG参数,waitpid不会在这里等待 */
  25.             pr = waitpid(pc, NULL, WNOHANG);
  26.             if ( pr == 0 )

  27.             {
  28.                 printf("No child exit\n");
  29.                 sleep(1);
  30.             }
  31.            }while (pr == 0 );
  32.         if ( pr == pc )
  33.             printf("successfully get child %d\n", pr);
  34.         else
  35.             printf("wait child error\n");

  36.     }
  37.     return 0;
  38. }

编译并运行:
$ gcc -o waitpid waitpid.c
$ ./waitpid
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
successfully get child 4607

父进程经过10次失败的尝试之后,终于收集到了退出的子进程。父进程和子进程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值