我在使用fork
功能时遇到问题。我想写一个程序
但是当最后一个子进程完成时,我无法跳回到第一个子进程,只打印最后一个子进程的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 Child 1,pid 21989
孩子2,pid 21990
ABC Child 2,pid 21990
孩子3,pid 21991
ABC Child 3,pid 21991
孩子4,pid 21992
ABC Child 4,pid 21992
我是父母,pid 21988:所有孩子都完成了
但我想要
孩子1,pid 21989
孩子2,pid 21990
孩子3,pid 21991
孩子4,pid 21992
ABC Child 1,pid 21989
ABC Child 2,pid 21990
ABC Child 3,pid 21991
ABC Child 4,pid 21992
答案 0 :(得分:0)
当你分叉一个新进程(或者一个新线程)时,它完全独立于父进程和父进程可能分叉的任何其他子进程运行。通常,您无法保证语句的执行顺序。
为了获得您想要的结果,孩子之间必须有某种同步方法。您可以让每个孩子打印第一行,向父母发送信号,然后在打印第二行之前等待信号。然后,父母将等待来自所有四个孩子的信号,然后向每个孩子发送信号。
使用单独的线程而不是单独的进程执行此操作会更清晰。在这种情况下,您可以使用互斥锁在线程之间进行同步。
答案 1 :(得分:0)
我想我更了解你现在的目标。您应该考虑做的是使用Pipe或其他形式的进程间通信来减慢进程,以便他们在您准备好之前不会丢弃他们已经拥有的所有内容。