Я отчаянно пытался убить дочерний процесс от родителя.
Я пробовал:
1. убить -15 пид
убить выстрел из дробовика
убить -9 пид
Все они решили, что дочерний процесс записывается как:
«несуществующий» (зомби), когда PS -A в Linux.
Как убить процесс и заставить его очистить таблицу процессов. Я должен очистить его, потому что отсутствие записи в таблице процессов — это то, как я проверяю в своем коде, что процесс мертв.
Спасибо 🙂
Если вы хотите собрать дочерний процесс, вы должны запросить его код завершения, используя 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.
Это, кстати, также позволяет вам фактически узнать, в каком состоянии находится процесс, читайте на странице руководства для получения дополнительной информации.
Других решений пока нет …