Как убить зомби-процесс, сохранив его родителя живым?

Я занимаюсь печатью в.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);
}
}
Другие вопросы по тегам