Докуруется ли WaitPID допустимая информация о состоянии для дочернего процесса, который уже вышел?

StackOverflow https://stackoverflow.com/questions/2865640

  •  30-09-2019
  •  | 
  •  

Вопрос

Если я 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, статус завершения, информация об использовании ресурсов), чтобы позволить родителю позже выполнить ждать, чтобы получить информацию о ребенке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top