fork
부모의 실행 맥락을 복제하고 두 프로세스가 서로 다른 반환값을 받는다.
Linux 프로세스 생성은 부모-자식 트리, fork와 exec의 분리, wait에 의한 종료 상태 회수까지 이어지는 수명주기로 읽어야 한다.
모든 일반 프로세스는 기존 프로세스가 만들며, 이 관계가 트리로 남는다.
부모의 실행 맥락을 복제하고 두 프로세스가 서로 다른 반환값을 받는다.
자식의 프로그램 이미지를 새 명령으로 교체한다.
새 프로세스가 독립 주소 공간과 파일 디스크립터를 가지고 실행된다.
프로세스가 종료 상태를 남기고 실행 자원을 정리한다.
부모가 종료 상태를 읽어 프로세스 테이블 항목을 회수한다.
새 PID와 부모-자식 관계 생성
메모리와 파일 디스크립터는 복제 또는 공유된다.
코드, 데이터, 스택이 새 프로그램으로 교체
PID와 일부 열린 파일 디스크립터는 유지된다.
자식의 종료 상태를 부모가 읽음
수거 전에는 최소한의 프로세스 테이블 항목이 남는다.
자식은 끝났지만 부모가 아직 wait로 종료 상태를 읽지 않았다.
부모가 먼저 종료되어 init 또는 subreaper가 입양한다.
서버와 컨테이너 PID 1은 자식 종료를 반드시 정리해야 한다.
fork와 exec 사이에서 리다이렉션과 환경
조작을 할 수 있다.
Windows와 Python spawn 방식은 처음부터 새 프로세스를 띄우는 쪽에 가깝다.
wait 누락은 좀비 누적으로 이어져 PID 고갈을 만들 수 있다.