【发布时间】:2015-10-01 13:41:29
【问题描述】:
我在使用 fork 函数时遇到问题。我想写一个程序
- 产生四个进程
- 打印每个进程的 PID,重复打印 PIDs
- 打印父级的 PID
但是当最后一个子进程完成时,我无法跳回第一个子进程,只能打印最后一个子进程的 PID。如何在父进程之前再次运行子进程?
int noOfPlayer=4;
int pid,myid,status,grandchild;
int i=0;
int a=1;
int x=1;
myid = getpid();
for(i=0;i<noOfPlayer;i++){
pid=fork();
if(pid<0){ //error occurred
printf("Fork Failed\n");exit(1);
} else if (pid==0) {//child process
myid=getpid();
printf("Child %d, pid %d\n",i+1,myid);
printf("ABC Child %d, pid %d\n",i+1,myid);
exit(0);
} else { //parent process
wait(NULL);
}
}
printf("I am parent, pid %d: all children finished\n", myid);
结果是
孩子 1,pid 21989
ABC 孩子 1,pid 21989
孩子 2,pid 21990
ABC 孩子 2,pid 21990
孩子 3,pid 21991
ABC 孩子 3,pid 21991
孩子 4,pid 21992
ABC 孩子 4,pid 21992
我是父母,pid 21988:所有孩子都完成了
但我想要
孩子 1,pid 21989
孩子 2,pid 21990
孩子 3,pid 21991
孩子 4,pid 21992
ABC 孩子 1,pid 21989
ABC 孩子 2,pid 21990
ABC 孩子 3,pid 21991
ABC 孩子 4,pid 21992
【问题讨论】:
-
对我来说不是很清楚。你有一些代码给我们看吗?
-
“跳回第一个子进程”是什么意思?
-
您的输出是可预测的,因为您一次运行一个子进程(父进程等待每个进程退出)。在任何情况下,您可能都想在循环之外使用
wait()。这仍然可能不会给您期望的输出(因为孩子之间没有顺序保证,并且标准输出可能会被缓冲)