세션의 ID가 시스템 호출을 통해 세션을 생성한 프로세스의 pid와 동일하다고 읽었 setsid()
으나 프로세스 그룹 ID를 설정하는 방법에 대한 정보를 찾지 못했습니다. 프로세스 그룹 ID는 프로세스 그룹을 생성한 프로세스의 pid와 동일합니까?
답변1
일반적으로 말하면, 프로세스 그룹 ID는 프로세스 그룹을 생성한 프로세스의 프로세스 ID와 동일하며 해당 프로세스는 자신을 그룹에 넣어 프로세스 그룹을 생성했습니다.
setpgid
시스템 호출 및 그 변형에 대한 문서에서 이 정보를 찾을 수 있습니다 setpgrp
. 세부 사항은 역사적으로 BSD와 System V 간에 서로 달랐습니다. 가장 일반적인 사용 사례는 다음과 같습니다.
- 프로세스는 PID와 동일한 새 PGID를 사용하여 자체 프로세스 그룹에 자신을 넣습니다. 이는
setpgrp()
SysV나 를 사용하여 수행 할 수setpgid(0, 0)
있으며 둘 중 하나를0
명시적으로 대체할 수 있습니다getpid()
.
참고하시기 바랍니다.프로세스자신을 그룹에 넣으십시오. 실제로 이것은 일반적으로 실행 전에 실행기(셸 또는 데몬 모니터)에 의해 수행됩니다.프로그램fork
즉,execve
하위 프로세스 사이와 하위 프로세스 내에서 실행 프로그램의 코드로 수행됩니다. 프로세스는 동일한 세션 내의 기존 프로세스 그룹에 배치됩니다. 쉘은 파이프에 대해 다음을 수행합니다. 자체 프로세스 그룹에서 실행하기 위해
foo | bar
쉘은 일반적으로 다음을 수행합니다.- 파이프라인을 설정합니다.
- 프로세스를 포크합니다. 하위 프로세스는 자신을 자체 프로세스 그룹에 넣습니다.G, 파이프의 읽기 끝을 닫고 쓰기 끝을 stdout으로 이동한 다음 를 실행합니다
foo
. - 프로세스를 포크합니다. 하위 프로세스는 자신을 기존 프로세스 그룹에 배치합니다.G, 파이프의 쓰기 끝을 닫고 빨간색 끝을 표준 입력으로 옮긴 다음 을 실행합니다
bar
.
부모 프로세스 에 대한 호출은
setpgid
자식 프로세스 대신 부모 프로세스에서 실행될 수도 있고, 자식 프로세스 외에 부모 프로세스에서도 실행될 수도 있습니다. 두 가지를 모두 수행하면 두 번째 자식의 초기화가 첫 번째 자식의 초기화를 초과하는 경우 경쟁 조건을 피할 수 있습니다.작업 제어 기능이 있는 쉘은 일반적으로 자체 프로세스 그룹에서 실행됩니다. 그러나 종료하거나 일시 중단하기 전에 원래 프로세스 그룹으로 돌아갑니다. 즉, 해당 그룹이 여전히 존재한다고 가정하고 자신을 시작한 프로세스 그룹에 다시 넣습니다.
이것POSIX 사양setpgid
이러한 사용 사례가 설명되어 있습니다. 또한 다른 방법은 작동이 보장되지 않는다고 설명합니다. 특히, 이전 BSD 시스템에서는 프로세스가 다른 세션의 프로세스 그룹에 합류하거나 새로운 PGID를 형성하는 것을 허용했지만, 대부분의 최신 시스템(최신 BSD 포함)에서는 그렇지 않습니다.