나는 이중 포크를 이해하려고 노력했고 여기 에서이 질문을 우연히 발견했습니다. 많은 연구 끝에 이것이 내가 알아 낸 것입니다. 다행스럽게도 같은 질문을 가진 사람에게는 더 잘 설명 할 수 있기를 바랍니다.
유닉스에서 모든 프로세스는 그룹에 속하고 세션에 속합니다. 계층 구조는 다음과 같습니다.
세션 (SID) → 프로세스 그룹 (PGID) → 프로세스 (PID)
프로세스 그룹의 첫 번째 프로세스는 프로세스 그룹 리더가되고 세션의 첫 번째 프로세스는 세션 리더가됩니다. 모든 세션에는 하나의 TTY가 연결될 수 있습니다. 세션 리더 만 TTY를 제어 할 수 있습니다. 프로세스가 실제로 디먼 처리 (배경에서 실행)되도록하려면 세션 리더가 종료되어 세션이 TTY를 제어 할 가능성이 없도록해야합니다.
우분투 의이 사이트 에서 Sander Marechal의 Python 예제 데몬 프로그램을 실행 했습니다 . 내 의견과 결과는 다음과 같습니다.
1. `Parent` = PID: 28084, PGID: 28084, SID: 28046
2. `Fork#1` = PID: 28085, PGID: 28084, SID: 28046
3. `Decouple#1`= PID: 28085, PGID: 28085, SID: 28085
4. `Fork#2` = PID: 28086, PGID: 28085, SID: 28085
주 과정 후 세션 리더임을 Decouple#1
이 때문에, PID = SID
. 여전히 TTY를 제어 할 수 있습니다.
참고 Fork#2
더 이상 세션 리더입니다 PID != SID
. 이 프로세스는 TTY를 제어 할 수 없습니다. 정말 데몬입니다.
나는 개인적으로 혼란스러워하는 용어를 두 번이나 포크합니다. 더 좋은 관용구는 포크 분리 포크입니다.
추가 관심 링크 :