Fork Per Connection

fork 서버는 부모가 문을 지키고 자식이 연결을 맡는다

accept가 반환한 connected socket을 자식 프로세스가 전담하고, 부모는 그 fd를 닫은 뒤 다시 accept 루프로 돌아간다.

부모는 listening socket을 유지한다.
자식은 server_fd를 닫고 client_fd만 처리한다.
자식 종료는 SIGCHLD/waitpid로 정리해야 좀비를 피한다.
Parent process accept loop 연결을 수락하고 fork한 뒤 다음 연결을 기다린다.
server_fdlisten
client_fdclose in parent
Child process handle_client 한 클라이언트의 recv/send 루프를 담당한다.
server_fdclose in child
client_fdread/write
장점 격리 자식 하나의 오류가 다른 연결에 번질 가능성이 낮다.
비용 프로세스 생성 메모리, 스케줄링, 컨텍스트 스위칭 비용이 커진다.
정리 좀비 방지 SIGCHLD 무시 또는 waitpid 반복 호출로 종료 상태를 회수한다.
fd 소유권 fork 직후에는 부모와 자식이 같은 열린 파일 설명을 공유한다. 불필요한 fd를 닫아야 연결 종료와 자원 회수가 예측 가능해진다.