일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 언리얼엔진
- gameplay tag
- os
- 유니티
- gravity direction
- ability task
- listen server
- 게임 개발
- 언리얼 엔진
- CTF
- attribute
- dirty cow
- ret2libc
- animation
- rpc
- map design
- unity
- Unreal Engine
- gameplay ability system
- 게임개발
- nanite
- MAC
- Aegis
- gameplay effect
- photon fusion2
- gas
- Multiplay
- UI
- Replication
- local prediction
- Today
- Total
Replicated
[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에서 쉘 끄면 좀비들 다 사라졌나 보다
'지식' 카테고리의 다른 글
[OS] Stack과 Heap 중 어디가 빠른가 (0) | 2025.03.21 |
---|---|
[OS] 초기화되지 않은 변수들은 어디에 저장? (0) | 2025.03.21 |
[OS] 루트 프로세스? (0) | 2025.03.21 |
[OS] 데몬 프로세스란? (0) | 2025.03.21 |
[Unreal] 나나이트는 무적이다? (0) | 2025.03.21 |