Мне, вероятно, придется добавить таблицу процессов, в которой хранятся дочерние pids.
и придется использовать waitpid - не обязательно, но через некоторое время
прошло - что является проблемой, потому что время работы детей
варьируется от нескольких микросекунд до нескольких минут. Если я тоже использую waitpid
рано, мой родительский процесс будет заблокирован
Ознакомьтесь с документацией для waitpid
. Вы можете указать waitpid
НЕ блокировать (т.е. немедленно возвращаться, если нет детей, чтобы пожинать), используя опцию WNOHANG
. Более того, вам не нужно давать waitpid
PID. Вы можете указать -1
, и он будет ждать любого ребенка. Таким образом, вызов waitpid
, как показано ниже, соответствует ограничениям без блокировки и ограничения без сохранения:
waitpid( -1, &status, WNOHANG );
Если вы действительно не хотите должным образом обрабатывать создание процесса, тогда вы можете передать ответственность за пожатие init
, дважды разветвившись, пожав ребенка и передав внуку exec
:
pid_t temp_pid, child_pid;
temp_pid = fork();
if( temp_pid == 0 ){
child_pid = fork();
if( child_pid == 0 ){
// exec()
error( EXIT_FAILURE, errno, "failed to exec :(" );
} else if( child_pid < 0 ){
error( EXIT_FAILURE, errno, "failed to fork :(" );
}
exit( EXIT_SUCCESS );
} else if( temp_pid < 0 ){
error( EXIT_FAILURE, errno, "failed to fork :(" );
} else {
wait( temp_pid );
}
В приведенном выше фрагменте кода дочерний процесс разветвляет своего собственного дочернего элемента, сразу же существует, а затем немедленно получает его родительский процесс. Внук осиротел, принят init
и будет пожинен автоматически.
Почему Linux вообще держит зомби? Почему я должен ждать моего
дети? Это для обеспечения дисциплины на родительских процессах? В
десятилетия использования Linux я никогда не получал ничего полезного от зомби
процессы, я не совсем понимаю полезность зомби как "особенность".
Если ответ заключается в том, что родительские процессы должны иметь способ выяснить,
что случилось с их детьми, то ради бога нет
причина считать зомби как нормальные процессы и запретить создание
не зомби процессы только потому, что слишком много зомби.
Как еще вы предлагаете эффективно извлекать код завершения процесса? Проблема в том, что отображение кода выхода PID <=> (и др.) Должно быть одно к одному. Если ядро выпустило PID процесса, как только он выйдет, пожнет или нет, а затем новый процесс наследует тот же PID и выйдет, как бы вы справились с хранением двух кодов для одного PID? Как заинтересованный процесс может получить код выхода для первого процесса? Не думайте, что никто не заботится о кодах выхода просто потому, что вы этого не делаете. То, что вы считаете неприятностью / ошибкой, широко считается полезным и чистым.
В системе, которую я сейчас разрабатываю, я могу вызвать только 400-500
обрабатывает, прежде чем все останавливается (это плохо поддерживается
Система CentOS работает на самом дешевом VServer, который я смог найти - но все же
400 зомби - это информация размером не более нескольких килобайт)
Что-то в том, чтобы сделать общепринятым поведение ядра козлом отпущения за то, что явно вызывает разочарование по поводу плохо обслуживаемой / дешевой системы, кажется неправильным.
Как правило, ваше максимальное количество процессов ограничено только вашей памятью. Вы можете увидеть свой лимит с помощью:
cat /proc/sys/kernel/threads-max