- 论坛徽章:
- 0
|
原帖http://zhidao.baidu.com/question ... 6#answer-1400878524
用wait回收进程只有第一个返回了正确的pid其余的都是返回-1
而使用waitpid指定pid都正确返回??
使用wait
- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<errno.h>
- int main()
- {
- pid_t pid2 = fork();
- if(pid2 == 0)
- {
- //我是子进程p2,被P1 fork出的
- printf("p2 pid:%d ppid%d\n",getpid(),getppid());
- exit(0);
- }
- else
- {
- //我还是是父进程p1,我要fork出p3
- pid_t pid3 = fork();
- if(pid3 == 0)
- {
- printf("p3 pid:%d ppid%d\n",getpid(),getppid());
- //父进程P3生成P4,P5,然后等p4,p5结束后生成p6
- pid_t pid4 = fork();
- if(pid4 == 0)
- {
- printf("p4 pid:%d ppid%d\n",getpid(),getppid());
- //我是p4
- exit(0);
- }
- else
- {
- //我是p3, 还要fork出p5
- pid_t pid5 = fork();
- if(pid5 == 0)
- {
- printf("p5 pid:%d ppid%d\n",getpid(),getppid());//我是p5
- exit(0);
- }
- else
- {
- //我还是p3
- printf("pid:%d finish\n",wait());
- }
- printf("pid:%d finish\n",wait());//wait(pid4);
- }
- //p4,p5结束,生成p6
- pid_t pid6 = fork();
- if(pid6 == 0)
- {
- printf("p6 pid:%d ppid%d\n",getpid(),getppid());
- //我是p6
- exit(0);
- }
- else
- {
- printf("pid:%d finish\n",wait());//wait(pid6);
- }
- exit(0);
- }
- else
- {
- //我是p1
- printf("pid:%d finish\n",wait());//wait(pid2);//回收p2
- printf("pid:%d finish\n",wait());//wait(pid3);//回收p3
- }
- sleep(1);
- //p2,p3执行完,生成p7
- pid_t pid7 = fork();
- if(pid7 == 0)
- {
- printf("p7 pid:%d ppid%d\n",getpid(),getppid());
- //我是p7
- exit(0);
- }
- else
- {
- printf("pid:%d finish\n",wait());//wait(pid7);
- }
- }
- getchar();
- }
复制代码 运行结果
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
- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<errno.h>
- int main()
- {
- pid_t pid2 = fork();
- if(pid2 == 0)
- {
- //我是子进程p2,被P1 fork出的
- printf("p2 pid:%d ppid%d\n",getpid(),getppid());
- exit(0);
- }
- else
- {
- //我还是是父进程p1,我要fork出p3
- pid_t pid3 = fork();
- if(pid3 == 0)
- {
- printf("p3 pid:%d ppid%d\n",getpid(),getppid());
- //父进程P3生成P4,P5,然后等p4,p5结束后生成p6
- pid_t pid4 = fork();
- if(pid4 == 0)
- {
- printf("p4 pid:%d ppid%d\n",getpid(),getppid());
- //我是p4
- exit(0);
- }
- else
- {
- //我是p3, 还要fork出p5
- pid_t pid5 = fork();
- if(pid5 == 0)
- {
- printf("p5 pid:%d ppid%d\n",getpid(),getppid());//我是p5
- exit(0);
- }
- else
- {
- //我还是p3
- printf("pid:%d finish\n",waitpid(pid5,NULL,0));
- }
- printf("pid:%d finish\n",waitpid(pid4,NULL,0));//wait(pid4);
- }
- //p4,p5结束,生成p6
- pid_t pid6 = fork();
- if(pid6 == 0)
- {
- printf("p6 pid:%d ppid%d\n",getpid(),getppid());
- //我是p6
- exit(0);
- }
- else
- {
- printf("pid:%d finish\n",waitpid(pid6,NULL,0));//wait(pid6);
- }
- exit(0);
- }
- else
- {
- //我是p1
- printf("pid:%d finish\n",waitpid(pid2,NULL,0));//wait(pid2);//回收p2
- printf("pid:%d finish\n",waitpid(pid3,NULL,0));//wait(pid3);//回收p3
- }
- //sleep(1);
- //p2,p3执行完,生成p7
- pid_t pid7 = fork();
- if(pid7 == 0)
- {
- printf("p7 pid:%d ppid%d\n",getpid(),getppid());
- //我是p7
- exit(0);
- }
- else
- {
- printf("pid:%d finish\n",waitpid(pid7,NULL,0));//wait(pid7);
- }
- }
- getchar();
- }
复制代码 运行结果
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
|
|