상위 프로세스가 종료되면 새 상위 프로세스 생성

상위 프로세스가 종료되면 새 상위 프로세스 생성

UNIX에서는 상위 프로세스가 종료되면 모든 하위 프로세스가 상위 프로세스로 초기화되는 것 같습니다. 이것은 줄곧 사실이 아니었던가? 예외가 있나요?

답변1

2014년에 작성된 세 가지 답변은 모두 Unices와 Linux에서는 프로세스가 예외 없이 프로세스 #1로 재설정된다고 말합니다. 세 가지 잘못된 답변입니다. ☺

~처럼스테인레스 스틸말해봐, 하나 인용해봐다른여기에 답변했으므로 다시 인용하지 않겠습니다. 고아의 상위 프로세스는 다음과 같이 설정되어 있습니다.구현 정의프로세스. Cristian Ciupitu는 구현 정의가 무엇인지 확인하기 위해 Linux 문서를 참조하는 것이 옳습니다. 그러나 그는 일관성이 없고 최신이 아닌 문서 때문에 오해를 받았습니다.

2년 전 이 세 가지 답변이 작성되었을 때, 그리고 3년 전 이 답변이 처음 작성되었을 때 Linux 커널이 변경되었습니다. systemd 개발자는 프로세스 자체를 "자식 수확자"로 설정하는 기능을 추가했습니다. Linux 3.4부터 프로세스는 prctl()이 옵션을 사용하여 시스템 호출을 실행하여 PR_SET_CHILD_SUBREAPER프로세스 #1이 아닌 고아 하위 프로세스의 부모가 될 수 있습니다. 이것매뉴얼 페이지prctl()최신이지만 다른 매뉴얼 페이지는 아직 업데이트되지 않았으며 일관성도 없습니다.

버전 10.2에서 FreeBSD는 기존 기능을 확장하여 동일한 기능을 얻었습니다.procctl()PROC_REAP_ACQUIRE및 옵션이 포함된 시스템 호출 PROC_REAP_RELEASE. DragonFly BSD에서 이 메커니즘을 채택했습니다. 원래 reapctl()이름은 4.2였습니다 procctl().

따라서 예외가 있으며 매우 눈에 띄는 예외가 있습니다. Linux, FreeBSD/PC-BSD 및 DragonFly BSD에서는 고아가 된 자식의 부모가 자식 리퍼로 표시된 자식의 가장 가까운 조상으로 설정되거나 프로세스 #1이 있는 경우 조상 하위 리퍼 프로세스가 없습니다. systemd(개발자가 Linux 커널에 처음 추가한 유틸리티), upstart 및 nosh를 포함한 다양한 데몬 모니터링 유틸리티에서 service-manager이미 이 유틸리티를 사용하고 있습니다.

그러한 데몬 관리자가 프로세스 #1이 아니고 대화형 로그인 세션과 같은 서비스를 생성하고 해당 세션 내에서 다음을 수행하는 경우fork()두 배로 "보호"하려는 (다소 잘못된) 기술, 그러면 프로세스는 프로세스 #1의 하위가 아닌 데몬 관리자의 하위가 됩니다. 물론, 로그인 세션에서 직접 데몬을 생성할 수 있다고 기대하는 것은 근본적인 실수입니다. 하지만 여기에 또 다른 대답이 있습니다.

추가 읽기

답변2

~에 따르면exitSingle UNIX® 사양 2판 매뉴얼 페이지:

호출 프로세스의 모든 기존 하위 프로세스와 좀비 프로세스의 상위 프로세스 ID는 구현 종속 시스템 프로세스의 프로세스 ID로 설정됩니다. 즉, 이러한 프로세스는 특수 시스템 프로세스에 의해 상속됩니다.

대부분의 Unix 변형의 경우 이 특수 프로세스는 init(PID 1)입니다.

리눅스wait(2)매뉴얼 페이지에서는 다음을 확인합니다.

부모 프로세스가 종료되면 해당 "좀비" 자식 프로세스(있는 경우)는 init(8)에 의해 채택되며 자동으로 좀비 프로세스 제거를 기다립니다.

FreeBSDwait(2), 네트워크BSDwait(2), 오픈BSDwait(2)그리고 맥 OS Xwait(2)매뉴얼 페이지에서도 이를 확인합니다.

모든 하위 프로세스가 종료될 때까지 기다리지 않고 상위 프로세스가 종료되면 나머지 하위 프로세스에는 상위 프로세스 1 ID(init 프로세스 ID)가 할당됩니다.

오라클 솔라리스 11.1wait(3C)매뉴얼 페이지에서도 이를 확인합니다.

상위 프로세스가 하위 프로세스가 종료될 때까지 기다리지 않고 종료되는 경우 각 하위 프로세스의 상위 프로세스 ID는 1로 설정되고 초기화 프로세스는 하위 프로세스를 상속합니다.Intro(2).

답변3

내 의견을 답변으로 옮기면... 예외가 있다고 생각하지 않습니다.

발견 "자식 프로세스가 종료되기 전에 상위 프로세스가 종료되는 경우가 있습니다. 이 경우 "모든 프로세스의 상위" init프로세스가 새로운 PPID(상위 프로세스 ID)가 됩니다. 때때로 이러한 프로세스를 고아 프로세스라고 합니다."원천

IBM에도 비슷한 설명이 있습니다.블로그: "부모 프로세스가 자식 프로세스보다 먼저 죽거나 죽습니다. 위의 경우 자식 프로세스는 고아 프로세스가 됩니다(상위 프로세스를 잃기 때문입니다). Linux에서는 init고아 프로세스를 구출하여 채택합니다. 즉, 하위 프로세스가 상위 프로세스를 잃으면 해당 init프로세스는 새 상위 프로세스가 됩니다."

답변4

나는 그것이 사실이라고 믿지 않습니다. 항상 init 프로세스에 들어갑니다.

http://en.wikipedia.org/wiki/Orphan_process

관련 정보