Почему поведение программы может зависеть от порядка, в котором ее дети заканчивают? - PullRequest
2 голосов
/ 18 июня 2011

Я запускаю несколько программ, используя 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 имеет некоторую простую обработку и контроль доходит до конца.

Ответы [ 2 ]

6 голосов
/ 18 июня 2011
while(wait(&status) != child1);
while(wait(&status) != child2);

В этом коде - вы будете ждать, пока не закончится child1, но если child2 закончится первым - вы получите статус и откажетесь от него. Затем, когда child1 завершится - вы перейдете к следующему циклу, но тогда вы никогда не получите статус для child2, потому что вы уже сбросили его.

Вместо этого сохраняйте массив дочерних элементов и продолжайте цикл wait, пока не получите статус для каждого из элементов массива в одном цикле while, тогда вы не будете заблокированы.

1 голос
/ 18 июня 2011

Это звучит как правильное поведение для того, что вы описываете.wait() блокируется, пока не произойдет то, чего он ждет.Если программа wait s для нескольких вещей подряд, ей придется ждать для нескольких вещей подряд.Похоже, вы используете waitpid() вместо wait().Если вы используете real wait(), вам просто нужно будет вызывать его столько раз, сколько детей ждут.

Если вам все равно, в каком порядкесделать программу не зависящей от какого-либо конкретного порядка.

...