Как ждать () только для некоторых дочерних процессов и предотвращать зомби - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь написать макет-оболочку в c на Linux и застрял в этой проблеме:

Мне нужно запустить некоторые процессы в фоновом режиме, а некоторые процессы на переднем плане.Чтобы предотвратить превращение процессов переднего плана в зомби, я могу использовать wait (), но как я могу предотвратить превращение фоновых процессов в зомби?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вы не можете предотвратить превращение какого-либо процесса в зомби, но вы можете ограничить время, в течение которого остается единицей.Процесс - это зомби с момента, когда он заканчивается, до момента, когда его родитель собирает его с помощью вызова wait() или waitpid() или другой функции, выполняющей эту функцию.Это время может быть действительно очень коротким, например, если родительский процесс уже ожидает, когда дочерний процесс завершается, но завершение и последующий сбор не являются синхронными.

Различие между фоновым и передним процессами главным образом заключается в управлениитерминал;это не имеет ничего общего с родительской оболочкой, управляющей дочерними процессами.Вы собираете дочерние процессы, принадлежащие фоновым заданиям, с помощью wait(), и т. Д. . Точно так же, как вы собираете дочерние процессы, принадлежащие приоритетным заданиям.Вы можете собирать уже завершенных дочерних элементов, не ожидая неопределенных, используя waitpid() с флагом W_NOHANG, как уже описано @Someprogrammerdude.Осталось вставить такие ожидания в подходящее время, и для интерактивных оболочек, как правило, планируют это вокруг чтения команд от пользователя.

0 голосов
/ 24 ноября 2018

Вы можете опросить для, используя waitpid с флагом W_NOHANG.Или вы можете добавить обработчик SIGCHLD, который будет вызываться при каждом завершении дочернего процесса (или при других изменениях статуса).

...