프로세스가 하위 프로세스의 소유권을 상위 프로세스에 전달할 수 있습니까?
배경
조부모, 부모, 자식이라는 3개의 프로세스가 있다고 가정해 보겠습니다.
부모는 자녀를 낳고 계속 살아갑니다(부모는 죽지 않습니다).
아이가 사망하면 조부모가 처리하므로 아이가 사망하면 조부모에게 알려야 한다. SIGCHLD를 얻는 것이 좋을 것입니다.
답변1
일반적으로 부모 프로세스는 wait()
자식 프로세스가 종료될 때 좀비 프로세스가 되지 않도록 자식 프로세스에 대한 작업을 수행하는 역할을 담당합니다. 부모 프로세스가 자식 프로세스보다 먼저 종료되면 일부 프로세스는 부모 프로세스를 정리하는 역할을 수행하여 다시 자식 프로세스가 좀비 프로세스가 되는 것을 방지해야 합니다. 기본적으로 프로세스가 종료되면 나머지 하위 프로세스는 pid 1의 프로세스로 재설정됩니다.
Linux는 시스템 호출에 대해 prctl
이 옵션을 제공합니다 . PR_SET_CHILD_SUBREAPER
매뉴얼 페이지에 따르면 prctl
:
PR_SET_CHILD_SUBREAPER
(리눅스 3.4부터)0이 아니면
arg2
호출 프로세스의 "하위 하위 리퍼" 속성을 설정하고,arg2
0이면 속성을 설정 해제합니다.
init(1)
하위 수확기는 하위 프로세스의 역할을 수행합니다. 프로세스가 고아가 되면(즉, 직계 부모가 종료되면) 프로세스는 가장 가까운 생존 조상 자식 리퍼로 다시 할당됩니다.고아 프로세스에 대한 후속 호출은
getppid()
이제 자식 수확기 프로세스의 PID를 반환하며, 고아 프로세스가 종료되면 자식 수확기 프로세스는 신호를 수신 하고 프로세스에서 종료 상태를 검색SIGCHLD
할 수 있습니다 .wait(2)
"하위 하위 리퍼" 속성에 대한 설정은
fork(2)
하위 리퍼로 생성된 하위 항목에 상속 되지 않습니다clone(2)
. 이 설정은 프로세스 전반에 걸쳐 유지됩니다execve(2)
.하위 수확기 프로세스 설정은 프로세스의 계층적 그룹이 하위 수확기 프로세스에 의해 관리되고 프로세스 중 하나(예: 두 분기 데몬)가 종료되면 하위 수확기 프로세스에 알림이 필요한 세션 관리 프레임워크에 유용합니다( 아마도 해당 프로세스를 다시 시작할 수 있도록). 비슷한 이유로 일부
init(1)
프레임워크(예:systemd(1)
)에서는 하위 리퍼 프로세스를 사용합니다.
이는 옵션일 수 있지만 부모가 사망한 전이적 하위 항목(손주뿐만 아니라)은 호출 프로세스의 부모로 다시 할당됩니다.