Как убить процесс зомби, сохранив его родительский элемент? [дубликат]

На этот вопрос уже есть ответ здесь:

Я делаю печать в основной структуре .net.

Для печати каждой этикетки я запускаю процесс. Итак, для 100 этикеток создается 100 зомби-процессов.

Зомби-процесс удаляется из таблицы процессов только тогда, когда я останавливаю родительское приложение, создавшее процесс печати.

Но я не могу останавливать приложение каждый раз, так как это повлияет на другие функции.

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

Я перепробовал все способы, указанные в ссылке: Есть ли способ убить зомби-процесс без перезагрузки? но ничего не работает.

Я не могу убить родительский процесс.

0
задан 13 April 2017 в 15:23

1 ответ

Вы не можете создать процесс-зомби. При разветвлении процесса и этого разветвленного процесса (дочерние) концы он отправляет код возврата. Если родительский процесс не ожидает этого кода возврата, дочерний процесс становится зомби (дочерний процесс, который умирает, и родитель не знает).

На языке 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);
}
}
1
ответ дан 28 September 2019 в 01:39

Другие вопросы по тегам:

Похожие вопросы: