Linux waitpid用WNOHANG

来源:互联网 发布:淘宝商品鞋子详情图片 编辑:程序博客网 时间:2024/05/30 12:03
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秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。
0 0