【问题标题】:C program child process rub again before parent processC程序子进程在父进程之前再次摩擦
【发布时间】: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()。这仍然可能不会给您期望的输出(因为孩子之间没有顺序保证,并且标准输出可能会被缓冲)

标签: c linux fork


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我想我更好地理解你现在的打算。您应该考虑使用管道或其他形式的进程间通信来减慢进程速度,这样它们就不会在您准备好之前就扔掉所有的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2015-09-20
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多