Replicated

[OS] 자식 프로세스가 상태를 안알리고 죽거나, 부모 프로세스가 먼저 죽으면 어떻게 처리하는가 본문

지식

[OS] 자식 프로세스가 상태를 안알리고 죽거나, 부모 프로세스가 먼저 죽으면 어떻게 처리하는가

라구넹 2025. 3. 21. 15:58

1. 자식 프로세스가 상태를 안알리고 죽거나

wait() 또는 waitpid()로 수거되지 않았다는 것

 

발생 현상: 좀비 프로세스 -> 커널이 PID와 종료 상태 정보 유지.. 자원 계속 차지함

 

 

해결 방법

- 자식의 종료를 반드시 wait, waitpid로 처리

- 자식 프로세스의 종료에 관심이 없으면 밑의 코드

#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

void sigchld_handler(int sig) {
    // 여러 자식이 한꺼번에 종료되었을 수도 있으므로 반복
    while (waitpid(-1, NULL, WNOHANG) > 0) {
        // 자식 수거
    }
}

int main() {
    signal(SIGCHLD, sigchld_handler);  // SIGCHLD 시그널 핸들러 등록

    if (fork() == 0) {
        // 자식 프로세스
        printf("자식 프로세스 실행 중\n");
        sleep(1);
        return 0;
    }

    // 부모 프로세스는 종료된 자식을 기다리지 않아도
    // 핸들러가 자동으로 수거해 줌
    while (1) {
        printf("부모 루프 실행 중\n");
        sleep(2);
    }

    return 0;
}

SIGCHLD라는 시그널은 자식 프로세스가 종료되거나 중단, 재개될 때 발생

pid -1은 자식 중 아무나 종료되면 반환됨

 

WNOHANG은 대기하지 말라는 뜻

왜 쓰냐?

- waitpid는 자식이 끝날때까지 블로킹하니까 비동기적으로 체크

 

 

https://github.com/Lagooneng/system_programming_shell/blob/main/mysh.c

 

system_programming_shell/mysh.c at main · Lagooneng/system_programming_shell

쉘 구현. Contribute to Lagooneng/system_programming_shell development by creating an account on GitHub.

github.com

몇년 전에 시스템 프로그래밍 쉘 과제할 때 아무리 해도 자식 프로세스가 좀비가 남아있었는데 이제야 문제를 알았다

 

2. 부모 프로세스가 먼저 죽으면 어떻게 처리하는가

발생 현상: 자식 프로세스는 고아 프로세스(Orphan Process)가 됨

자동으로 init 프로세스(pid 1) 또는 systemd에게 입양(adopt)됨

자식 종료 시 위에 둘 중에 입양한 애가 wait호출해서 좀비가 되지 않음

 

아 그래서 위에 mysh에서 쉘 끄면 좀비들 다 사라졌나 보다