2015-10-13 7 views
1

У меня есть цикл, который создает дочерние процессы n. Процессы переходят в отдельную программу и спят за «х» секунд, а затем возвращаются с статусом выхода «x». Проблема заключается в том, что я стараюсь ждать каждого отдельного процесса. Кажется, что мой вызов wait() ждет последнего выполненного процесса, а затем программа завершает работу. Мне бы хотелось, чтобы из-за того, что когда-либо ребенок вышел, я могу распечатать их информацию, а затем ждать следующего ребенка, чтобы выйти и распечатать свою информацию ... и так далее.wait() не ждет каждого ребенка

код:

int main() 
{ 
     char input[12]; 
     int n, i, ch; 
     pid_t pid; 
     int status={0}; 

     printf("Enter an integer: "); 
     fgets(input, 12, stdin); 
     if (input[10] == '\n' && input[11] == '\0') { while ((ch = fgetc(stdin)) != EOF && ch != '\n'); } 
     rmnewline(input); 

     n = atoi(input); 

     for(i=0; i<=n-1; i++) 
     { 
     pid = fork(); 
     if(pid == 0) 
     execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL); 
     } 

     for(i=0; i<=n-1; i++) 
     { 
     wait(&status); 
     if(WIFEXITED(status)) 
     { 
      int exitstat = WEXITSTATUS(status); 
      printf("Child %d is dead with exit status %d\n", pid, exitstat); 
     } 
     } 
} 

выход:

In child 15930 
In child 15929 
In child 15928 
Child 15930 is dead with exit status 5 
Child 15930 is dead with exit status 5 
Child 15930 is dead with exit status 5 
+0

Помимо этого: 'i <= n-1' будет более понятным как' i

+0

@WeatherVane No. С смещениями массива, основанными на нуле, 'for (i = 0; i < n; i ++) '- это канонический способ записи цикла' for' в C. Просто Google «c для цикла». См. Много примеров: http://www.codingunit.com/c-tutorial-for-loop-while-loop-break-and-continue http://stackoverflow.com/questions/4604500/use-of-for-in -ac-sharp-application http://www.tutorialspoint.com/cprogramming/c_for_loop.htm http://www.thegeekstuff.com/2012/12/c-loops-examples/ Кроме того, исключение вычитания может привести к немного улучшенная производительность, особенно на архитектуре с головокружительной регистрацией, такой как x86. –

+1

@ AndrewHenle Вы уверены, что вы верно прочитали мой комментарий? Что, если 'n == 0', управление циклом' i <= n-1' может сходить с ума при отсутствии знака. Я написал «яснее», а не «яснее». –

ответ

1

Вы забыли захватить возвращаемое значение из wait(), так pid все еще содержит PID последнего процесса вы отделились.

ли это:

pid = wait(&status); 

И вы получите ожидаемый результат.

+0

Благодарим вас за освобождение! Хотя все дети все равно выходят одновременно с тем же «случайным» статусом выхода. EDIT: В настоящее время я изменяю, как генерируется семя случайного числа, поскольку это может быть проблемой. –

+1

@AndrewRicci Когда вы 'fork()', дочерний процесс выполняется независимо от родителя и любого другого дочернего процесса. Все они запланированы отдельно ОС, поэтому вы не можете контролировать, когда каждый из них заканчивается без использования мьютированных труб, сигналов или разделяемой памяти. Значение выхода полностью зависит от дочернего процесса. – dbush

+0

Программа, которую они выполняют, генерирует случайное число с 'srand (time (NULL)); затем он спит для случайного времени между 0 и 9. Его не контролируют только то, что все они должны выходить в разное время. –

Смежные вопросы