다음 APUE 그림을 보면 궁금합니다. 프로세스 세션에서 세션 리더의 프로세스 그룹에는 세션 리더만 포함되고 다른 프로세스는 포함되지 않습니까?
생성된 모든 프로세스는
fork()
상위 프로세스로부터 동일한 프로세스 그룹 및 세션을 상속받습니다. 그렇다면 세션 리더는 원하는 만큼의 프로세스를 자신의 프로세스 그룹으로 분기할 수 있습니까?예를 들어, 쉘(세션 리더인 경우)이 프로세스 그룹의 유일한 프로세스입니까? 그렇다면 쉘이 자식 프로세스를 분기할 때 자식 프로세스는 처음에는 쉘과 동일한 프로세스 그룹에 있지만 나중에는호출하여 즉시 새 프로세스 그룹을 시작합니다.
setpgid()
?
감사해요.
답변1
아니요, 그러한 제한은 없습니다. 이 경우 작업 제어를 구현하지 않는 명령(실제로는 쉘만 수행함)은 시작 시 프로세스를 분기할 수 없습니다(하위 프로세스가 프로세스 그룹을 상속하기 때문입니다) xterm -e that-command
.
세션 리더가 작업 제어가 활성화된 대화형 셸인 경우에도 해당 그룹에 다른 프로세스가 있을 수 있습니다.
달리기:
xterm -e 'sleep 1000 & exec zsh'
저기 xterm
:
PID PGID SID TTY TIME CMD
14003 14003 14003 pts/20 00:00:00 zsh
14004 14003 14003 pts/20 00:00:00 sleep
14012 14012 14003 pts/20 00:00:00 ps
대부분의 명령은 별도의 프로세스 그룹에서 실행되는 대화형 셸에서 실행되지만 모든 명령이 그렇지는 않습니다.
예를 들면 다음과 같습니다 bash
.
$ exec 3< <(sleep 1000)
$ ps -j
PID PGID SID TTY TIME CMD
13913 13913 13913 pts/19 00:00:00 bash
14136 13913 13913 pts/19 00:00:00 bash
14137 13913 13913 pts/19 00:00:00 sleep
14138 14138 13913 pts/19 00:00:00 ps
또는 프롬프트 확장의 일부로 시작된 프로세스:
$ PS1=$'$(ps -j)\n$ '
PID PGID SID TTY TIME CMD
14212 14212 14212 pts/18 00:00:00 bash
14292 14212 14212 pts/18 00:00:00 ps
$
답변2
모든 외부 명령은 셸과 다른 프로세스 그룹에서 실행됩니다. 쉘은 세션 리더이므로 해당 프로세스 그룹의 유일한 프로세스입니다.
동일한 파이프라인에 속하는 모든 명령은 동일한 프로세스 그룹에 있습니다.