셸은 fork, exec, exit, wait 순서로 명령을 끝낸다

bash에서 ls를 실행하면 부모는 자식을 만든 뒤 기다리고, 자식은 프로그램 이미지를 바꿔 실행한 다음 종료 상태를 남긴다.

1. fork · 흐름 분기

부모

자식 PID를 받고 셸 상태를 유지한다.

자식

반환값 0을 받고 새 실행 경로로 갈라진다.

2. exec · 이미지 교체

부모

waitpid에서 자식 종료를 기다린다.

자식

PID는 유지한 채 코드·데이터·스택을 ls로 바꾼다.

3. exit · 결과 보관

부모

커널의 종료 알림으로 대기에서 깨어난다.

자식

실행 자원을 반납하고 종료 상태만 커널에 남긴다.

4. waitpid · 회수

부모

상태 코드를 읽고 다음 프롬프트를 연다.

자식

PCB의 마지막 기록까지 제거되어 완전히 사라진다.

경계 상태 · 자식의 exit 뒤 부모의 wait 전까지는 종료 기록이 남는다. 이 회수가 늦어진 상태가 좀비다.