Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Как последовательно запустить несколько процессов, а код завершения последнего потомка передать первому процессу?

#c #linux

                    
Добрый вечер. Подскажите как правильно выполнить задачу?
Необходимо создать цепочку из 5 последовательно запущенных процессов, когда каждый
дочерний процесс становится родителем для следующего потомка. Код завершения последнего
потомка передать первому процессу. В первом процессе вывести данное число на экран.

Создал в цикле 5 процессов:

pid_t return_value;

  for(int i = 0; i < 5; i++)
  {
    return_value = fork();
    printf("%s %d %s %d\n", "Процесс: ", getpid(), "PID: ", return_value);  
  }

  return 0;


Данный код выдает мне в терминале огромную простыню, 


Я так понимаю что это из-за того, что после создания нового процесса они продолжают
выполняться параллельно. Как код завершения последнего потомка передать первому процессу
так и не выяснил. Подскажите как правильно сделать? 
    


Ответы

Ответ 1



Надеюсь, Вы уже сами успешно решили свою задачку, но на всякий случай вот простой код. #include #include #include #include int main (int ac, char *av[]) { int n = 5, s; srand(getpid()); while (n--) if (fork()) break; if (n < 0) { // last child s = rand() % 100; printf("child %d exit rc: %d\n", (int)getpid(), s); exit(s); } wait(&s); if (n != 4) // all except first exit(WEXITSTATUS(s)); printf("Grandfather %d: child exited: %d\n", (int)getpid(), WEXITSTATUS(s)); return puts("End") == EOF; } Т.е. делаем цикл по переменной (в коде -- n), которая наследуется новым процессом и в нем запускаем новый процесс. Родитель выходит из цикла, ждет завершения потомка (тот в свою очередь ждет завершения своего потомка и так 5 раз). Если это не прародитель (определяем по n), то выходим с кодом завершения потомка, который получили в wait(). (без pipe передать PID последнего процесса в первый не получится (конечно, кроме разделяемой памяти или файла), но это мы с Вами вроде уже обсуждали).

Комментариев нет:

Отправить комментарий