세션 리더가 해당 그룹의 유일한 프로세스인가요?

세션 리더가 해당 그룹의 유일한 프로세스인가요?

다음 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

모든 외부 명령은 셸과 다른 프로세스 그룹에서 실행됩니다. 쉘은 세션 리더이므로 해당 프로세스 그룹의 유일한 프로세스입니다.

동일한 파이프라인에 속하는 모든 명령은 동일한 프로세스 그룹에 있습니다.

관련 정보