3

The following diagram from APUE leads me to wonder: in a process session, does the process group of the session leader contain only the session leader and no other process?

  • Any process created by fork() will inherit the same process group and session from its parent. So can the session leader fork arbitrary number of processes into its own process group?

  • For example, is a shell (when it is a session leader) the only process in its process group? If yes, is it because when the shell forks a child process, the child is initially in the same process group as the shell, but then immediately starts a new process group by calling setpgid() ?

Thanks.

enter image description here

2

No, there's no such restriction. If it was the case, commands that don't implement job control (in practice, only shells do) wouldn't be able to fork a process (as child processes inherit the process group) when started as xterm -e that-command for instance.

Even when the session leader is an interactive shell with job control enabled, you can have other processes in its group.

Running:

xterm -e 'sleep 1000 & exec zsh'

And in that 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

Most commands run from an interactive shell are run in separate process groups, but it's not the case for all.

For instance, in 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

Or the processes started as part of prompt expansions:

$ 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
$ 
  • Thanks. Do you happen to know why bash makes some child processes into new process groups, but not some other child processes? – Tim Dec 4 '18 at 14:26
1

All external commands are run in a process group different from the one of the shell. The shell is a session leader and thus that is the only process in its process group.

All commands which belong to the same pipeline are in the same process group.

  • Thanks. Is it correct that proc1 and proc2 may run external commands, but why are they in the same group in the diagram, contradicting to "All external commands are run in a different process group" ? – Tim May 6 '18 at 14:48
  • @Tim Probably a misunderstanding. I have improved the wording. – Hauke Laging May 6 '18 at 15:00
  • Thanks. I have updated my post. Hope that I clarify my problem. – Tim Dec 4 '18 at 12:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.