在父进程

时间:2015-10-01 13:41:29

标签: 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();
    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

2 个答案:

答案 0 :(得分:0)

当你分叉一个新进程(或者一个新线程)时,它完全独立于父进程和父进程可能分叉的任何其他子进程运行。通常,您无法保证语句的执行顺序。

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

使用单独的线程而不是单独的进程执行此操作会更清晰。在这种情况下,您可以使用互斥锁在线程之间进行同步。

答案 1 :(得分:0)

我想我更了解你现在的目标。您应该考虑做的是使用Pipe或其他形式的进程间通信来减慢进程,以便他们在您准备好之前不会丢弃他们已经拥有的所有内容。