WNOHANG очищает дочерние ресурсы - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь понять, как и действительно ли waitpid () с использованием WNOHANG очищает ресурсы дочернего элемента, которого он должен ждать?

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {

        printf("Hello from start\n");

        int pid;

        if((pid = fork()) == 0){
                printf("Hello from child: %d\n", getpid());
                printf("My parent PID is: %d\n", getppid());
        }else if(pid > 0){
                printf("Hello from parent: %d\n", getpid());
                int status;
                waitpid(pid, &status, WNOHANG);
        }else{
                perror("ERROR");
        }

        printf("Outside if statement, pid is: %d\n", getpid());


}

Выход для дочернего процесса для родительского PID: 1 означает родительский процесс завершен, и дочерний процесс был зомбирован ie передан процессу инициализации.

Из того, что я понял WNOHANG в описании человека, он должен возвращать, был ли дочерний процесс завершен во время его тестирования, и позволить родительскому процессу продолжаться. Однако я подумал, что если родитель собирался завершить работу до своего дочернего элемента, он будет ждать, пока дочерний элемент «очистит его». Из этого кажется, что родитель просто продолжает работу и завершает работу, не очищая. 1008 *

Спасибо!

1 Ответ

3 голосов
/ 03 августа 2020

Однако я подумал, что если родитель собирался завершить работу раньше, чем его дочерний элемент, он будет ждать, пока дочерний элемент «очистит его».

Это не так. Родитель не будет ждать. Дочерние элементы завершающегося процесса переносятся в процесс 1, и они автоматически получат пожатие при завершении.

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

work();

int status;
waitpid(pid, &status, 0);
...