Страницы

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

пятница, 5 июля 2019 г.

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

Добрый вечер. Подскажите как правильно выполнить задачу? Необходимо создать цепочку из 5 последовательно запущенных процессов, когда каждый дочерний процесс становится родителем для следующего потомка. Код завершения последнего потомка передать первому процессу. В первом процессе вывести данное число на экран.
Создал в цикле 5 процессов:
pid_t return_value;
for(int i = 0; i < 5; i++) { return_value = fork(); printf("%s %d %s %d
", "Процесс: ", getpid(), "PID: ", return_value); }
return 0;
Данный код выдает мне в терминале огромную простыню,
Я так понимаю что это из-за того, что после создания нового процесса они продолжают выполняться параллельно. Как код завершения последнего потомка передать первому процессу так и не выяснил. Подскажите как правильно сделать?


Ответ

Надеюсь, Вы уже сами успешно решили свою задачку, но на всякий случай вот простой код.
#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
", (int)getpid(), s); exit(s); }
wait(&s); if (n != 4) // all except first exit(WEXITSTATUS(s));
printf("Grandfather %d: child exited: %d
", (int)getpid(), WEXITSTATUS(s));
return puts("End") == EOF; }
Т.е. делаем цикл по переменной (в коде -- n), которая наследуется новым процессом и в нем запускаем новый процесс. Родитель выходит из цикла, ждет завершения потомка (тот в свою очередь ждет завершения своего потомка и так 5 раз). Если это не прародитель (определяем по n), то выходим с кодом завершения потомка, который получили в wait()
(без pipe передать PID последнего процесса в первый не получится (конечно, кроме разделяемой памяти или файла), но это мы с Вами вроде уже обсуждали).

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

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