2

fork()我使用第三个程序运行几个execve()程序。这些程序本来打算做的一切都完成了,但最后第三个程序没有返回......即命令提示符没有出现。

wait()如果我在调用程序中使用命令,则execve仅当等待语句的顺序与程序结束的顺序匹配时,程序才会返回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);
  }

如果 child1 先完成,它工作正常。./xyz 和./abc 有一些简单的处理和控制到最后。

4

2 回答 2

6
while(wait(&status) != child1);
while(wait(&status) != child2);

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

相反,保留一个子数组,然后循环wait直到您在单个while循环中获得数组中每个成员的状态,然后您就不会陷入僵局。

于 2011-06-18T08:33:42.323 回答
1

这听起来像是您所描述的正确行为。wait()阻塞,直到它等待的事情发生。如果程序wait连续执行几件事,则它必须连续等待几件事。听起来您正在使用waitpid()而不是wait(). 如果你使用real wait(),你应该只需要调用它的次数与等待孩子的次数相同。

如果您不关心顺序是什么,请使程序不依赖于任何特定顺序。

于 2011-06-18T07:49:30.503 回答