Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序的子进程在父进程之前再次摩擦_C_Linux_Fork - Fatal编程技术网

C程序的子进程在父进程之前再次摩擦

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

我在使用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=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

当您为此分叉一个新进程或一个新线程时,它完全独立于父进程和父进程可能分叉的任何其他子进程运行。一般来说,您不能保证语句的执行顺序

为了得到您想要的结果,必须在子级之间使用某种同步方法。您可以让每个子级打印第一行,向父级发送信号,然后在打印第二行之前等待信号。然后,家长会等待来自所有四个孩子的信号,然后向每个孩子发送一个信号


使用单独的线程而不是单独的进程来实现这一点会更干净。在这种情况下,您可以使用互斥体在线程之间进行同步。

我想我更了解您现在要做什么。你应该考虑的是使用一个管道或其他形式的进程间通信来减缓进程,这样他们就不会在你准备好之前就把他们所有的东西都扔掉。您是否有一些代码向我们展示?跳回第一个子进程是什么意思?您的输出是可预测的,因为您正在一次一个地运行子进程,而父进程等待每个进程退出。在任何情况下,您都可能希望在循环之外等待。这仍然可能无法提供您期望的输出,因为子级之间没有顺序保证,并且标准输出可能会被缓冲