Докуруется ли WaitPID допустимая информация о состоянии для дочернего процесса, который уже вышел?
Вопрос
Если я fork
Детский процесс, а дочерний процесс выходит до родительских звонков waitpid
, тогда это информация о состоянии выхода, которая устанавливается waitpid
все еще действует? Если это так, когда он становится недействительным; то есть как я могу позвонить waitpid
На PID ребенка и продолжайте получать действительную информацию о состоянии выхода после произвольного количества времени, и как мне «убирать» (сообщите ОС, что я больше не заинтересован в информации о состоянии выхода для готового ребенка)?
Я играл со следующим кодом, и кажется, что информация о состоянии состояния действительна в течение как минимум на несколько секунд после окончания ребенка, но я не знаю, как долго или как сообщить ОС, что я не буду призыв waitpid
опять таки:
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "Failed to fork\n");
return EXIT_FAILURE;
}
else if (pid == 0) { // code for child process
_exit(17);
}
else { // code for parent
sleep(3);
int status;
waitpid(pid, &status, 0);
waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect
assert(WIFEXITED(status));
assert(WEXITSTATUS(status) == 17);
}
return EXIT_SUCCESS;
}
Решение
Да, waitpid
будет работать после того, как ребенок вышла. ОС будет сохранять вход в детский процесс в таблице процессов (включая состояние выхода), пока родительские звонки waitpid
(или другие wait
-Мамилия функция) или до тех пор, пока родитель не выходит (в какой момент статус собирается init
обработать). Это то, что является процессом «зомби»: процесс, который выступил, все еще является резидентом в таблице процессов для именно этой цели.
Процесс ввода в таблице должен уйти после первого звонка waitpid
. Отказ Я подозреваю причину того, что в вашем примере вы, кажется, сможете позвонить waitpid
дважды просто потому, что waitpid
не изменит status
аргумент, если pid
больше не существует. Поэтому первый звонок должен работать и заполнить status
, и второй звонок должен возвращать код ошибки и не меняться status
. Отказ Вы можете проверить это, проверяя значения возврата waitpid
звонки и / или используя два разных status
Переменные.
Другие советы
ОС продолжает прекращенный процесс в Государство зомби пока его родитель (который может быть init
Если исходный родительский процесс прекращен ранее) собирает статус выхода с wait(2)
Системный вызов. Так что ответ - это состояние выхода процесса не становится недействительным.
да.
Из человек страницы:
Ребенок, который прекращает, но не был ждал, становится «зомби». Ядро поддерживает минимальный набор информации о процессе зомби (PID, статус завершения, информация об использовании ресурсов), чтобы позволить родителю позже выполнить ждать, чтобы получить информацию о ребенке.