As sessões contêm grupos de processos que contêm processos.
Esses foram criados principalmente para controle de trabalho de terminal. Uma sessão é normalmente associada a uma sessão de login em um terminal ou a toda a sessão do shell em um emulador de terminal.
Quando você faz login ou inicia xterm
, é criado um novo processo que inicia uma nova sessão (que inicia automaticamente um novo grupo de processos) e esse processo (que agora é líder de sessão e líder do grupo de processos) executa seu login Concha. Ao abrir o dispositivo terminal sem O_NOCTTY, esse processo também associa esse dispositivo terminal à sessão (e se torna o processo de controle desse terminal). Esse dispositivo terminal se torna o terminal de controle de todos os processos naquela sessão.
Esse shell, em seguida, executa trabalhos em seu próprio grupo de processos (bifurcando um processo que inicia um novo grupo de processos e pode acabar bifurcando vários outros processos nesse grupo (por exemplo, para pipelines como cmd1 | cmd2
)) e faz especial ioctl()s
para o dispositivo de terminal para dizer qual desses jobs está em primeiro plano (assim eles podem fazer I / O para o terminal e receber o SIGINT em CTRL-C, por exemplo).
Então, sim, você normalmente tem vários grupos de processos por sessão.
Por exemplo, em um shell interativo:
$ sleep 1 | sh -c 'sleep 2; :' & ps -j
[1] 2902 2903
PID PGID SID TTY TIME CMD
2902 2902 4648 pts/23 00:00:00 sleep
2903 2902 4648 pts/23 00:00:00 sh
2904 2904 4648 pts/23 00:00:00 ps
2905 2902 4648 pts/23 00:00:00 sleep
4648 4648 4648 pts/23 00:00:00 zsh
3 grupos de processos, um em primeiro plano ( ps
), um em segundo plano com 3 processos ( sleep
, sleep
, sh
) e meu shell interativo.
Todos os processos de um grupo de processos estão necessariamente na mesma sessão que a criação de uma nova sessão (que você não pode fazer se for um líder de grupo de processos) cria automaticamente um novo grupo de processos.
Eu recomendo a leitura
info libc 'Job Control'
em um sistema GNU para mais informações.