나는 Linux 데몬을 생성하는 규칙에 대해 약간 혼란스러워합니다. 데몬 구성 요소가 터미널과 연결되어 있지 않다는 데 대부분 동의합니다. 또한 샘플 코드에서는 일반적으로 프로세스의 부모가 종료되고 데몬이 부모를 재설정하여 초기화합니다. 나는 이것이 그렇게 하는 방법이라는 것을 완전히 이해합니다. 그런데 왜 그럴까요? 프로세스에는 연관된 터미널이 없으며 init의 직계 하위 프로세스입니다. 이점은 무엇입니까?
답변1
https://en.wikipedia.org/wiki/SIGHUP
1. 연관된 터미널이 없는 프로세스의 이점은 무엇입니까?
POSIX 호환 플랫폼에서 SIGHUP("신호 끊기")은 프로세스로 전송되는 신호입니다.제어 터미널이 닫힐 때. (원래 직렬 라인이 삭제된 프로세스를 알리기 위해 설계되었습니다.)
[...]
POSIX 호환 시스템의 기본 작업 [SIGHUP]은 중단하는 것입니다.
상황을 올바르게 이해하면 두 가지 상황이 있습니다.
명백한 상황은GNOME 터미널과 같은 터미널 에뮬레이터를 닫거나mc
, 의사 단말 장치의 기본 터미널을 닫습니다. 이렇게 닫으면 의사 터미널이 정지됩니다. 이는 슬레이브 장치에 영향을 미칩니다. 이 터미널에서 제어하는 모든 프로세스는 SIGHUP을 수신합니다. 이것은아니요위의 상황.
@JDePB지적두 번째 경우: 터미널 장치를 참조하는 모든 파일 설명자가 닫히면 끊김도 발생합니다. 즉, 데몬이 tty의 FD(반드시 그래야 함)를 닫고 나중에 다른 프로세스에서 tty의 종료된 FD를 여는 경우 터미널 에뮬레이터가 응답하지 않고 마스터 의사 터미널을 열어두더라도 데몬은 SIGHUP을 수신하게 됩니다. 이 기능은 다음을 통해 전체 최종 장치에 대해 비활성화될 수 있습니다.청산 HUPCL.
게다가 vhangup()
. login
이전 세션이 방해하지 않는지 확인하기 위해 이 메서드가 호출되는 것 같습니다 . 또는 다른 것. 이 호출은 Linux에만 해당되고 매뉴얼 페이지가 매우 짧기 때문에 확실하지 않습니다.
2. init의 직계 하위 프로세스인가요?
SIGHUP을 수신하는 프로세스가 Unix 셸인 경우 작업 제어의 일부로 일반적으로 신호를 가로채고 중지된 모든 프로세스가 이전에 계속 실행되도록 합니다.자식 프로세스에 신호 보내기(보다 정확하게는 셸에서 내부적으로 "작업"으로 표시되는 프로세스 그룹)은 기본적으로 해당 그룹을 종료합니다.