为什么程序的行为取决于孩子完成的顺序?

Lip*_*eka 2 c linux fork execve

我运行了几个程序,fork()然后execve()是第三个程序.这些程序的所有内容都已完成,但最后第三个程序没有返回...即命令提示符不会出现.

如果我wait()在调用程序中使用一个命令,那么execve只有当wait语句的顺序与execve程序结束的顺序匹配时,程序才会返回.为什么会这样?

这是简化的代码:

int main()
{
   int child1,child2,status;
   char*newargv1[] = {./xyz",NULL};
   char *newargv2[] = {./abc",NULL};

   if((child1 = fork())==0)
      execve(newargv1[0],newargv1,NULL);
   if((child2 = fork())==0)
      execve(newargv2[0],newargv2,NULL);

    while(wait(&status) != child1);
    while(wait(&status) != child2);
  }
Run Code Online (Sandbox Code Playgroud)

如果child1首先完成,它可以正常工作../xyz和./abc有一些简单的处理和控制到达终点.

lit*_*adv 6

while(wait(&status) != child1);
while(wait(&status) != child2);
Run Code Online (Sandbox Code Playgroud)

在此代码中 - 您将等到child1完成,但如果child2先完成 - 您将获得状态并将其丢弃.然后,当child1完成时 - 你将进入下一个循环,但是你将永远不会获得状态child2因为你已经丢弃了它.

相反,保留一个子数组,并循环打开,wait直到您在一个while循环中获得数组的每个成员的状态,然后您将不会死锁.