На этот вопрос уже есть ответ здесь:
Я делаю печать в основной структуре .net.
Для печати каждой этикетки я запускаю процесс. Итак, для 100 этикеток создается 100 зомби-процессов.
Зомби-процесс удаляется из таблицы процессов только тогда, когда я останавливаю родительское приложение, создавшее процесс печати.
Но я не могу останавливать приложение каждый раз, так как это повлияет на другие функции.
Как я могу убить зомби, не убивая родительское приложение? Сколько зомби-процессов может обработать Ubuntu?
Я перепробовал все способы, указанные в ссылке: Есть ли способ убить зомби-процесс без перезагрузки? но ничего не работает.
Я не могу убить родительский процесс.
Вы не можете создать процесс-зомби. При разветвлении процесса и этого разветвленного процесса (дочерние) концы он отправляет код возврата. Если родительский процесс не ожидает этого кода возврата, дочерний процесс становится зомби (дочерний процесс, который умирает, и родитель не знает).
На языке C, это было бы ожидание () функция в родительском процессе, который читает возвращаемое значение.
Общее обходное решение для этого (если у Вас нет намерения в родительском процессе для ожидания кода возврата от ребенка) должно удвоить ветвление. Это означает, Ваш основной процесс A создаст новый процесс B, который запустит процесс C. Обработайте концы B сразу, обработайте A, может получить его код возврата прямо после запуска его. Процесс C сделает то, что необходимо (печатающие маркировки в Вашем случае) и когда он закончится, он будет, отправил код возврата. Ее родительский процесс B уже мертв, таким образом, система будет заботиться о нем (процесс с pid 1, в прошлом не уверенным, как это работает теперь). И это не станет зомби.
Редактирование: Вот пример, который я нашел в https://stackoverflow.com/questions/10932592/why-fork-twice первое, если последовательность будет процессом после ветвления, то это будет просто ожидать своего дочернего процесса B для окончания.
int main()
{
pid_t p1 = fork();
if (p1 != 0)
{
printf("p1 process id is %d", getpid());
wait();
system("ps");
}
else
{
pid_t p2 = fork();
int pid = getpid();
if (p2 != 0)
{
printf("p2 process id is %d", pid);
}
else
{
printf("p3 process id is %d", pid);
}
exit(0);
}
}