기본적으로 커널은 고아가 되고 중지된 프로세스를 포함하는 프로세스 그룹에 SIGHUP을 보내 모든 프로세스를 종료합니까?

기본적으로 커널은 고아가 되고 중지된 프로세스를 포함하는 프로세스 그룹에 SIGHUP을 보내 모든 프로세스를 종료합니까?

Linux 프로그래밍 인터페이스에서

격리된 프로세스 그룹이 중요한 이유를 이해하려면 셸 작업 제어 관점에서 사물을 살펴봐야 합니다. 그림 34-3을 기반으로 다음 시나리오를 고려하십시오.

  1. 상위 프로세스가 종료되기 전에 하위 프로세스가 중지됩니다(아마도 상위 프로세스가 중지 신호를 보냈기 때문일 수 있음).

  2. 상위 프로세스가 종료되면 쉘은 작업 목록에서 상위 프로세스의 프로세스 그룹을 제거합니다. 하위 프로세스는 init에 의해 채택되며 터미널의 백그라운드 프로세스가 됩니다. 하위 프로세스를 포함하는 프로세스 그룹은 격리됩니다.

  3. 이때 어떤 프로세스도 wait()를 통해 중지된 자식 프로세스의 상태를 모니터링하지 않습니다.

쉘은 자식 프로세스를 생성하지 않기 때문에 자식 프로세스가 존재하는지 또는 자식 프로세스가 죽은 부모 프로세스와 동일한 프로세스 그룹에 속해 있는지 알지 못합니다. 또한 init 프로세스는 종료된 하위 프로세스만 확인한 다음 생성된 좀비 프로세스를 가져옵니다. 따라서 중지된 하위 프로세스는 실행을 재개하기 위해 SIGCONT 신호를 보내는 방법을 아는 다른 프로세스가 없기 때문에 영원히 정체될 수 있습니다.

고아 프로세스 그룹의 중지된 프로세스에 다른 세션에서 여전히 활성 상태인 상위 프로세스가 있는 경우에도 상위 프로세스가 중지된 하위 프로세스에 SIGCONT를 보낼 수 있다는 보장은 없습니다. 프로세스는 동일한 세션의 다른 프로세스에 SIGCONT를 보낼 수 있지만 하위 프로세스가 다른 세션에 있는 경우 신호 전송에 대한 일반적인 규칙(섹션 20.5)이 적용되므로 상위 프로세스가 다른 세션에 신호를 보내지 못할 수 있습니다. 하위 프로세스가 자격 증명이 변경된 권한 있는 프로세스인 경우 하위 프로세스입니다.

위 상황을 방지하기 위해 SUSv3에서는 다음을 지정합니다.만약에프로세스 그룹이 분리되어 있고 중지된 구성원이 있습니다. 그 다음에그룹의 모든 구성원은 SIGHUP 신호를 받아 세션 연결이 끊어졌음을 알리고 SIGCONT 신호를 보내 실행을 다시 시작합니다. 고아 프로세스 그룹에 중지된 멤버가 없으면 신호가 전송되지 않습니다.

SIGHUP의 기본 작업은 종료입니다. 그렇다면 커널이 고아가 되고 중지된 프로세스를 포함하는 프로세스 그룹에 암시적으로 SIGHUP을 보낸다는 의미입니까?

  • 자체 SIGHUP 구성이 없으면 그룹의 해당 프로세스가 종료됩니까? 그룹에서 중지된 프로세스가 먼저 SIGCONT에 의해 재개되고 SIGHUP에 의해 종료됩니까?

  • 그룹의 프로세스가 유지되려면 자체 SIGHUP 구성이 필요합니까, 아니면 SIGHUP을 무시합니까?

감사해요.

답변1

mosvy의 의견을 답변으로 바꾸겠습니다.

예 예. 내 답변의 의견을 읽을 수 있습니다여기이 기능을 구현하는 Linux 소스 코드에 대한 링크(Linux 소스 코드의 주석과 실제 코드는 그 산문이나 내가 설명하는 것보다 훨씬 낫습니다)

관련 정보