Ao enviar um sinal para o PID 0 (zero), o sinal é entregue a todos os processos que são membros do mesmo grupo de processos do remetente. Um grupo de processos diferente do atual pode ser sinalizado com kill(-PGID)
(ou kill -- -PGID
no shell), onde PGID
é o ID do grupo de processos.
O grupo de processos de um PID é retornado pela função getpgid()
, e o grupo de processos do processo atual pode ser encontrado com getpgrp()
.
No shell, você pode usar
$ ps -opid,pgid,command
para obter o PID, o PGID (ID do grupo de processos) e a linha de comando da sua sessão atual.
Isso pode retornar algo como
PID PGID COMMAND
20716 20716 -ksh93 (ksh93)
83662 83662 -ksh93 (ksh93)
4322 4322 /usr/X11R6/bin/xclock
5374 5374 tmux: client (/tmp/tmux-11000/default) (tmux)
78747 78747 -ksh93 (ksh93)
29298 29298 ps -opid
63563 63563 -ksh93 (ksh93)
63327 63327 mutt
21790 21790 -ksh93 (ksh93)
64493 64493 /bin/sh /usr/X11R6/bin/startx
14485 64493 xinit /home/kk/.xinitrc -- /usr/X11R6/bin/X :0 -auth /home/kk/.serverauth.E3cwuT5FZR
93531 93531 sh /home/kk/.xinitrc
48598 93531 flwm
28154 93531 xterm
73053 93531 xterm
Após um esclarecimento da pergunta:
O propósito de um grupo de processos é poder enviar um sinal para todos os seus membros sem conhecer os IDs de cada membro individual.
Sem um conceito de grupo de processos, seria necessário obter todos os processos no sistema, descobrir como eles estão relacionados (usando os IDs de processo pai) e iterar sobre os processos relevantes, enviando cada um o sinal.
O kernel faz isso, mas conhece e acompanha os grupos de processos, portanto, ele nunca terá que iterar sobre todos os processos para enviar um sinal para um grupo de processos, somente sobre os membros do grupo. grupo.
Como o ID do grupo de processos é exposto ao usuário, basta consultar o um processo para seu ID de grupo de processos antes de poder enviar um sinal para todos processos nesse grupo.