Заставить родителя пожинать дочерний процесс & lt; defunct & gt;

Я отчаянно пытался убить дочерний процесс от родителя.

Я пробовал:
1. убить -15 пид

  1. убить выстрел из дробовика

  2. убить -9 пид

Все они решили, что дочерний процесс записывается как:
«несуществующий» (зомби), когда PS -A в Linux.

Как убить процесс и заставить его очистить таблицу процессов. Я должен очистить его, потому что отсутствие записи в таблице процессов — это то, как я проверяю в своем коде, что процесс мертв.

Спасибо 🙂

2

Решение

Если вы хотите собрать дочерний процесс, вы должны запросить его код завершения, используя waitpid, Из справочной страницы:

Ребенок, который заканчивается, но его не ждут, становится «зомби». Ядро поддерживает минимальный набор информации о процессе зомби (PID, статус завершения, информация об использовании ресурсов), чтобы позволить родителю позднее выполнить ожидание для получения информации о дочернем элементе. Пока зомби не удаляется из системы с помощью ожидания, он будет занимать слот в таблице процессов ядра, и, если эта таблица заполнится, будет невозможно создавать дальнейшие процессы.

Использование примерно так:

#include <sys/types.h>
#include <sys/wait.h>

...
waitpid(child_pid, 0, 0);

Если вы хотите вернуться немедленно, даже если ребенок еще не вышел:

waitpid(child_pid, 0, WNOHANG);

Если вы просто хотите собрать всех детей-зомби, не найдя информацию о конкретном ребенке, вы делаете:

waitpid(-1, 0, WNOHANG);

Вы можете сделать это в цикле, пока waitpid возвращается с отрицательным числом (то есть ошибкой), а errno указывает ECHILD.

Это, кстати, также позволяет вам фактически узнать, в каком состоянии находится процесс, читайте на странице руководства для получения дополнительной информации.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]