중지된 프로세스가 포함된 새로운 고아 프로세스 그룹에 SIGHUP을 보내야 하는 이유는 무엇입니까?

중지된 프로세스가 포함된 새로운 고아 프로세스 그룹에 SIGHUP을 보내야 하는 이유는 무엇입니까?

이것UNIX 환경의 고급 프로그래밍BOOK("APUE") 라고

자식 프로세스로 분기된 다음 종료되는 프로세스를 생각해 보세요. 이는 이상한 일이 아니지만(항상 발생함) 상위 프로세스가 종료될 때 하위 프로세스가 중지(작업 제어를 사용하여)되면 어떻게 됩니까? 그 아이는 어떻게 살아남을 것이며, 그 아이는 자신이 고아가 되었다는 사실을 알게 될까요?

...

프로세스 그룹이 분리되지 않은 경우 다른 프로세스 그룹에 있지만 동일한 세션에 있는 상위 프로세스 중 하나가 분리되지 않은 프로세스 그룹에서 중지된 프로세스를 다시 시작할 수 있습니다.

...

부모 프로세스가 종료되면 프로세스 그룹은 고아가 되고 프로세스 그룹에는 중지된 프로세스가 포함되어 있기 때문에 POSIX.1에서는 새로 고아가 된 프로세스 그룹의 각 프로세스에 정지 신호(SIGHUP)를 보낸 다음 계속 신호(SIGCONT)를 보내야 합니다. ).

단지 프로세스 구성이 고아가 된 후에 중지된 프로세스가 깨어날 기회가 없다는 것이 문제라면 프로세스 구성이 고아가 되었을 때 커널이 SIGCONT를 보내지 않는 이유는 무엇이며 SIGHUP을 보내야 하는 이유는 무엇입니까? ?

답변1

실제로 우려되는 점은 중지된 프로세스가 깨어날 기회가 없다는 것뿐만 아니라 고아 프로세스가 되었음을 알리는 것입니다.

귀하의 APUE 발췌 내용은 다음과 같습니다:

자녀 있어요?알다고아가 되었나요?

SIGCONT만 수신하는 경우 고아가 되었음을 알 수 없습니다.

실제로 SIGHUP을 하위 프로세스에 보내는 것이 이 이벤트에 대한 알림을 받기 위해 선택된 방법입니다.

또한 이는 연결 해제 이벤트로 인해 쉘 자체가 SIGHUP을 수신할 때 일부 쉘(예: Bash)이 하위 프로세스에 수행하는 작업과 일치합니다. 익숙하다면 HUP+CONT를 통해서도 이 작업을 수행합니다. 클래스 이벤트가 전파됩니다. 이 특별한 경우에 대해 하위 프로세스를 중지합니다. 또한 참고로 SIGNALS 섹션 바로 아래에 있는 Bash 매뉴얼 페이지를 참조하세요.

실제로 이러한 커널 동작은 해당 쉘의 특정 동작을 고아 프로세스 그룹의 경우까지 확장합니다.


내 대답을 더 자세히 설명하기 위해 역사적으로 SIGHUP+SIGCONT가 아니라 단지 SIGKILL이었다는 점을 먼저 말씀드리겠습니다.

어느 시점에서 이것은 너무 가혹한 접근 방식으로 간주되었습니다. 실제로 이러한 방식으로 프로세스는 최소한 "우아하게 종료"될 가능성조차 없습니다. 즉, 하던 작업을 완료하고 리소스를 해제하는 등의 작업을 수행합니다.

따라서 SIGKILL은 현재의 보다 우아한 HUP+CONT 방법으로 변경되었습니다. 이는 프로세스가 스스로 정리할 수 있는 기회뿐만 아니라 원하는 경우 계속 실행할 수 있는 옵션도 제공합니다.

나는 POSIX 사양 전문가는 아니지만 다음 발췌문의 근거를 참고해 주세요._exit() 시스템 호출 사양:

[...], 프로세스 종료로 인해 프로세스 구성이 고아 프로세스가 되는 경우, [...] 그룹 내에서 중지된 프로세스는 영원히 사라집니다. 이 문제를 피하기 위해 중지된 프로세스를 포함하는 새로운 고아 프로세스 그룹에는 SIGHUP 신호와 SIGCONT 신호가 전송됩니다.표현세션 연결이 끊어졌습니다. SIGHUP 신호로 인해 프로세스 그룹 구성원이 종료됩니다.~하지 않는 한그들은 SIGHUP을 포착하거나 무시하고 있습니다.

확실한 진술은 아닐 수도 있지만 꽤 가깝다고 생각합니다.

그런 다음 프로세스 그룹 사용에도 주의를 기울이세요.아니요쉘 애플리케이션에 의해서만 구현되는 작업 제어로 제한됩니다. 너할 수 있는프로세스에 제어 터미널이나 제어 쉘이 없는 일반적인 "데몬" 프로세스와 같이 자체 세션이 있지만 자체적으로 여러 하위 프로세스를 생성하고 해당 프로세스를 사용하여 처리할 수 있는 프로세스 그룹으로 그룹화합니다(예: 문제 신호). 그룹 ID.

실제로 프로세스 그룹의 "쉘 작업 제어" 특정 사용 사례가 가장 널리 알려져 있고 사양 자체에서도 훌륭한 예로 자주 인용되지만 "프로세스 그룹"의 실제 POSIX 정의는 다음과 같습니다.

3.296 프로세스 그룹

관련 프로세스가 신호를 방출할 수 있도록 하는 프로세스 모음입니다. 시스템의 모든 프로세스는 프로세스 그룹 ID로 식별되는 프로세스 그룹의 구성원입니다. 새로 생성된 프로세스는 작성자의 프로세스 그룹에 추가됩니다.

일반적인프로세스의 수집.

"작업 제어"의 정의는 다음과 같습니다.

3.203 작업 제어

허가된 시설사용자프로세스 실행을 선택적으로 중지(일시 중지)하고 나중에 실행을 재개(재개)합니다. 사용자는 일반적으로 다음과 같은 방법으로 이 기능을 사용합니다.터미널 I/O 드라이버와 명령 해석기 모두에서 제공되는 대화형 인터페이스.

작업 제어는 대화형 쉘과 관련된 개념입니다.

프로세스 그룹화는 더 넓은 개념입니다.

화타이

관련 정보