C程序的子进程在父进程之前再次摩擦
我在使用fork函数时遇到问题。我想写一个程序 产生四个进程 打印每个进程的PID,重复打印PID 打印父级的PID 但是当最后一个子进程完成时,我不能跳回第一个子进程,只能打印最后一个子进程的PID。如何在父进程之前再次运行子进程C程序的子进程在父进程之前再次摩擦,c,linux,fork,C,Linux,Fork,我在使用fork函数时遇到问题。我想写一个程序 产生四个进程 打印每个进程的PID,重复打印PID 打印父级的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
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儿童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 Child 1,pid 21989
ABC儿童2,pid 21990
ABC儿童3,pid 21991
ABC Child 4,pid 21992当您为此分叉一个新进程或一个新线程时,它完全独立于父进程和父进程可能分叉的任何其他子进程运行。一般来说,您不能保证语句的执行顺序 为了得到您想要的结果,必须在子级之间使用某种同步方法。您可以让每个子级打印第一行,向父级发送信号,然后在打印第二行之前等待信号。然后,家长会等待来自所有四个孩子的信号,然后向每个孩子发送一个信号
使用单独的线程而不是单独的进程来实现这一点会更干净。在这种情况下,您可以使用互斥体在线程之间进行同步。我想我更了解您现在要做什么。你应该考虑的是使用一个管道或其他形式的进程间通信来减缓进程,这样他们就不会在你准备好之前就把他们所有的东西都扔掉。您是否有一些代码向我们展示?跳回第一个子进程是什么意思?您的输出是可预测的,因为您正在一次一个地运行子进程,而父进程等待每个进程退出。在任何情况下,您都可能希望在循环之外等待。这仍然可能无法提供您期望的输出,因为子级之间没有顺序保证,并且标准输出可能会被缓冲