[OS] 자식 프로세스가 상태를 안알리고 죽거나, 부모 프로세스가 먼저 죽으면 어떻게 처리하는가
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에서 쉘 끄면 좀비들 다 사라졌나 보다