Ваши дочерние процессы убиты. несуществующие процессы также называются процессы зомби ;зомби мертвы!Процесс зомби - это не что иное, как запись в таблице процессов, у него нет кода или памяти.
Когда процесс умирает (вызывая _exit
или убиваетсясигнал), его должен пожинать родитель.Каждый ресурс, используемый процессом, кроме записи в таблице процессов, исчезает.Родитель должен позвонить wait
или waitpid
.Как только родитель получит уведомление о смерти дочернего процесса и получит возможность прочитать статус выхода ребенка, запись о ребенке также исчезнет из таблицы процессов:
Если вы никогда не захотитечтобы получить уведомление о смерти ваших детей, не обращайте внимания на сигнал SIGCHLD
;это говорит ядру, что вам не интересно знать судьбу ваших детей, и зомби будут пожинаться автоматически.
signal(SIGCHLD, SIG_IGN)
Если вы хотите получать уведомления только о смерти ваших детей при определенных обстоятельствах, позвоните по номеру sigaction
с флагом SA_NOCLDWAIT
.Когда ребенок умирает, если родитель выполняет одну из функций семейства wait
, он будет уведомлен о смерти ребенка и получит статус выхода;в противном случае состояние выхода ребенка будет отклонено.
struct sigaction sa;
sa.sa_handler = &my_sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
Что касается вывода, ваши дети будут писать в те же места, что и родитель, если вы не перенаправили их явно (с помощью close
и open
или dup
, или ряд других возможностей).Ваши дети, вероятно, печатают диагностические сообщения к стандартной ошибке (в конце концов, для этого она и нужна).
./spawnbot >logging.txt 2>&1
Кроме того, поскольку вы, похоже, хотите отсоединить детей от терминала, вы, вероятно, захотите убедиться, что они не получат SIGHUP , если вы убьете терминал.Так что используйте nohup
:
nohup ./spawnbot >logging.txt 2>&1 &
disown