2013-09-27 6 views
0

У меня есть цепь процесса, глядя, как это (основной процесс) P0 создает P1, то P1 P2 создать и т.д ...Процесс цепи окончание друг друга от последнего

Когда Pn создается (п быть случайным число ~ 10), весь процесс, за исключением P0, должен быть остановлен сигналом SIGSTOP. Когда все они остановлены, P0 должен распечатать f («Все остановлено»), а затем разбудить их все с помощью SIGCONT.

Это много сделано, но вот в чем проблема: Когда P (n) пробуждается (с помощью P (n-1)), весь процесс (кроме P0) должен быть убит, а затем P0 printf («Конец прога»)

Я не могу использовать wait, waitpid. Я попытался заставить Pn отправить сигнал P0, а затем P0 отправить сигнал SIGTERM ко всему процессу, но Pn всегда будет заканчиваться ПОСЛЕ P0, и это плохо. Я также пытался сделать Pn kill P (n-1) и P (n-1) убивает P (n-2), ту же проблему.

Во всяком случае, есть идея, чтобы убедиться, что весь процесс был убит, когда P9 печатает сообщение? Я использую SIGCHLD для P0, чтобы знать, когда P1 остановлен (поэтому P2, P3, ...). И я тоже могу использовать его для этого, но как узнать, получаю ли я этот сигнал в P0, потому что P1 убит или возобновлен или остановлен?

+0

Откуда взялось требование не использовать 'wait',' waitpid'? Ваши процессы с мертвым ребенком станут зомби, пока они не ждут. – fizzer

+0

Это упражнение, которое я должен сделать, поэтому у меня нет выбора – badoualy

ответ

0

Я нашел решение, как только весь процесс был остановлен, я обновляю маску действия с помощью SA_NOCLDSTOP | SA_NOCLDWAIT, чтобы убедиться, что, как только мой обработчик SIGCHLD будет вызван, это будет связано с тем, что дочерний процесс мертв (и проблем с зомби нет).

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