Как убить зомби-процесс, сохранив его родителя живым?
Я занимаюсь печатью в.net core framework.
Для печати каждой этикетки я запускаю процесс. Таким образом, для 100 ярлыков создается процесс 100 зомби.
Процесс зомби удаляется из таблицы процессов, только когда я останавливаю родительское приложение, которое создало процесс печати.
Но я не могу остановить приложение каждый раз, так как это повлияет на другие функции.
Как убить зомби, не убивая родительское приложение? Сколько зомби-процессов Ubuntu может обработать?
Я перепробовал все способы, приведенные в ссылке: есть ли способ убить процесс зомби без перезагрузки? но никто не работает.
Я не могу убить родительский процесс.
1 ответ
Вы не можете создать процесс зомби. Когда вы разветвляете процесс, и этот разветвленный процесс (дочерний) завершается, он отправляет код возврата. Если родительский процесс не ожидает этот код возврата, дочерний процесс становится зомби (дочерний процесс, который умирает, а родитель не знает).
На языке Си это будет функция wait() в родительском процессе, которая читает возвращаемое значение.
Обычный обходной путь для этого (если вы не собираетесь в родительском процессе ждать код возврата от дочернего процесса) - это двойная форк. Это означает, что ваш основной процесс A создаст новый процесс B, который запустит процесс C. Процесс B завершается немедленно, процесс A может получить свой код возврата сразу после его запуска. Процесс C будет делать все, что нужно (печать этикеток в вашем случае), и по окончании будет отправлен код возврата. Его родительский процесс B уже мертв, поэтому система позаботится об этом (процесс с pid 1 в прошлом, не уверен, как это работает сейчас). И это не станет зомби.
Изменить: Вот пример, который я нашел на https://stackoverflow.com/questions/10932592/why-fork-twice Первый, если последовательность является процессом A после разветвления, он просто будет ждать завершения своего дочернего процесса 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);
}
}