免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3232 | 回复: 2
打印 上一主题 下一主题

[函数] fork 用wait返回-1?waitpid正常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-10 14:53 |只看该作者 |倒序浏览

原帖http://zhidao.baidu.com/question ... 6#answer-1400878524
用wait回收进程只有第一个返回了正确的pid其余的都是返回-1
而使用waitpid指定pid都正确返回??

使用wait

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<errno.h>
  5. int main()
  6. {
  7.     pid_t pid2 = fork();
  8.     if(pid2 == 0)
  9.     {
  10.         //我是子进程p2,被P1 fork出的
  11.         printf("p2  pid:%d ppid%d\n",getpid(),getppid());
  12.         exit(0);
  13.     }
  14.     else
  15.     {
  16.         //我还是是父进程p1,我要fork出p3
  17.         pid_t pid3 = fork();
  18.         if(pid3 == 0)
  19.         {
  20.             printf("p3  pid:%d ppid%d\n",getpid(),getppid());
  21.             //父进程P3生成P4,P5,然后等p4,p5结束后生成p6
  22.             pid_t pid4 = fork();
  23.             if(pid4 == 0)
  24.             {
  25.                 printf("p4  pid:%d ppid%d\n",getpid(),getppid());
  26.                 //我是p4
  27.                 exit(0);
  28.             }
  29.             else
  30.             {
  31.                 //我是p3, 还要fork出p5
  32.                 pid_t pid5 = fork();
  33.                 if(pid5 == 0)
  34.                 {
  35.                     printf("p5  pid:%d ppid%d\n",getpid(),getppid());//我是p5
  36.                     exit(0);
  37.                 }
  38.                 else
  39.                 {
  40.                     //我还是p3
  41.                     printf("pid:%d finish\n",wait());
  42.                 }
  43.                 printf("pid:%d finish\n",wait());//wait(pid4);
  44.             }
  45.             //p4,p5结束,生成p6
  46.             pid_t pid6 = fork();
  47.             if(pid6 == 0)
  48.             {
  49.                 printf("p6  pid:%d ppid%d\n",getpid(),getppid());
  50.                 //我是p6
  51.                 exit(0);
  52.             }
  53.             else
  54.             {
  55.                 printf("pid:%d finish\n",wait());//wait(pid6);
  56.             }
  57.             exit(0);
  58.         }
  59.         else
  60.         {
  61.             //我是p1
  62.             printf("pid:%d finish\n",wait());//wait(pid2);//回收p2
  63.             printf("pid:%d finish\n",wait());//wait(pid3);//回收p3
  64.         }
  65.         sleep(1);
  66.         //p2,p3执行完,生成p7
  67.         pid_t pid7 = fork();
  68.         if(pid7 == 0)
  69.         {
  70.             printf("p7  pid:%d ppid%d\n",getpid(),getppid());
  71.             //我是p7
  72.             exit(0);
  73.         }
  74.         else
  75.         {
  76.             printf("pid:%d finish\n",wait());//wait(pid7);
  77.         }

  78.     }
  79.     getchar();
  80. }
复制代码
运行结果
p2  pid:25401 ppid25400
p3  pid:25402 ppid25400
pid:25401 finish
p4  pid:25403 ppid25402
p5  pid:25404 ppid25402
pid:-1 finish
pid:-1 finish
p6  pid:25405 ppid25402
pid:-1 finish
pid:-1 finish
p7  pid:25408 ppid25400
pid:-1 finish

使用waitpid

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<errno.h>
  5. int main()
  6. {
  7.     pid_t pid2 = fork();
  8.     if(pid2 == 0)
  9.     {
  10.         //我是子进程p2,被P1 fork出的
  11.         printf("p2  pid:%d ppid%d\n",getpid(),getppid());
  12.         exit(0);
  13.     }
  14.     else
  15.     {
  16.         //我还是是父进程p1,我要fork出p3
  17.         pid_t pid3 = fork();
  18.         if(pid3 == 0)
  19.         {
  20.             printf("p3  pid:%d ppid%d\n",getpid(),getppid());
  21.             //父进程P3生成P4,P5,然后等p4,p5结束后生成p6
  22.             pid_t pid4 = fork();
  23.             if(pid4 == 0)
  24.             {
  25.                 printf("p4  pid:%d ppid%d\n",getpid(),getppid());
  26.                 //我是p4
  27.                 exit(0);
  28.             }
  29.             else
  30.             {
  31.                 //我是p3, 还要fork出p5
  32.                 pid_t pid5 = fork();
  33.                 if(pid5 == 0)
  34.                 {
  35.                     printf("p5  pid:%d ppid%d\n",getpid(),getppid());//我是p5
  36.                     exit(0);
  37.                 }
  38.                 else
  39.                 {
  40.                     //我还是p3
  41.                     printf("pid:%d finish\n",waitpid(pid5,NULL,0));
  42.                 }
  43.                 printf("pid:%d finish\n",waitpid(pid4,NULL,0));//wait(pid4);
  44.             }
  45.             //p4,p5结束,生成p6
  46.             pid_t pid6 = fork();
  47.             if(pid6 == 0)
  48.             {
  49.                 printf("p6  pid:%d ppid%d\n",getpid(),getppid());
  50.                 //我是p6
  51.                 exit(0);
  52.             }
  53.             else
  54.             {
  55.                 printf("pid:%d finish\n",waitpid(pid6,NULL,0));//wait(pid6);
  56.             }
  57.             exit(0);
  58.         }
  59.         else
  60.         {
  61.             //我是p1
  62.             printf("pid:%d finish\n",waitpid(pid2,NULL,0));//wait(pid2);//回收p2
  63.             printf("pid:%d finish\n",waitpid(pid3,NULL,0));//wait(pid3);//回收p3
  64.         }
  65.         //sleep(1);
  66.         //p2,p3执行完,生成p7
  67.         pid_t pid7 = fork();
  68.         if(pid7 == 0)
  69.         {
  70.             printf("p7  pid:%d ppid%d\n",getpid(),getppid());
  71.             //我是p7
  72.             exit(0);
  73.         }
  74.         else
  75.         {
  76.             printf("pid:%d finish\n",waitpid(pid7,NULL,0));//wait(pid7);
  77.         }

  78.     }
  79.     getchar();
  80. }
复制代码
运行结果
p2  pid:25606 ppid25605
p3  pid:25607 ppid25605
pid:25606 finish
p4  pid:25608 ppid25607
p5  pid:25609 ppid25607
pid:25609 finish
pid:25608 finish
p6  pid:25610 ppid25607
pid:25610 finish
pid:25607 finish
p7  pid:25611 ppid25605
pid:25611 finish

论坛徽章:
0
2 [报告]
发表于 2013-06-10 14:54 |只看该作者
是为啥呢

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
3 [报告]
发表于 2013-06-10 17:01 |只看该作者
回复 1# lcishot
wait的原型:
  1. #include <sys/wait.h>

  2.        pid_t wait(int *stat_loc);
复制代码
你可以将wait()改为wait(NULL),再包含头文件sys/wait.h试试。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP