O Ctrl + C pode enviar o sinal SIGINT para vários processos?

3

Eu li que quando você pressiona Ctrl+C , então um sinal SIGINT será enviado para o grupo de processos em primeiro plano .

Você pode me dar um exemplo de como eu posso ter dois ou mais processos no grupo de processos em primeiro plano , porque quero ver se todos os processos terminarão se eu pressionar Ctrl+C .

    
por Steve 16.05.2017 / 20:43

3 respostas

2

Como novos processos pertencem ao mesmo processo O grupo , do processo pai, tem um processo que inicia um monte de processos ( fork ) e, em seguida, com o registro e um atraso apropriados, digite control + c . Todos eles comem SIGINT .

$ perl -E 'fork for 1..2;say "ima $$"; $SIG{INT}=sub{die "woe $$\n"}; sleep 999'
ima 80920
ima 80922
ima 80921
ima 80923
^Cwoe 80920
woe 80922
woe 80921
woe 80923
$ 

(Adicione strace ou sysdig ou algo assim para ver as chamadas do sistema ou os sinais envolvidos.)

    
por 16.05.2017 / 21:50
2

Um pipeline é um trabalho , com vários processos:

(cat ; echo foo >&2) | (cat ; echo bar >&2 )

Se você encerrar a entrada com ^D , obterá a saída foo e bar , se você eliminar o pipeline com ^C , nenhum deles será impresso.

    
por 16.05.2017 / 21:11
0

Um exemplo:

bash-4.3$ ( ( sleep 2 & (ps -Hfj | sh -c cat; perl -MPOSIX -E 'say tcgetpgrp 0'; sleep 5;:);:);:)
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
chazelas 18631  3848 18631 18631  0 12:51 pts/7    00:00:00 /bin/zsh
chazelas  2184 18631  2184 18631  0 21:00 pts/7    00:00:00   bash --norc
chazelas  2430  2184  2430 18631  0 21:07 pts/7    00:00:00     bash --norc
chazelas  2431  2430  2430 18631  0 21:07 pts/7    00:00:00       bash --norc
chazelas  2432  2431  2430 18631  0 21:07 pts/7    00:00:00         sleep 2
chazelas  2433  2431  2430 18631  0 21:07 pts/7    00:00:00         bash --norc
chazelas  2434  2433  2430 18631  0 21:07 pts/7    00:00:00           ps -Hfj
chazelas  2435  2433  2430 18631  0 21:07 pts/7    00:00:00           sh -c cat
chazelas  2436  2435  2430 18631  0 21:07 pts/7    00:00:00             cat
2430

No momento em que ps estava em execução, havia 7 processos no grupo de processos 2430: 3 processos subshell ( bash ), um executando ps , um executando sh , um executando cat , um executando sleep 1 . Posteriormente, os processos gerados para executar perl e sleep 5 também estariam no mesmo grupo.

tcgetpgrp() confirma que 2430 era de fato o grupo de processos em primeiro plano do dispositivo terminal, então, ao pressionar Ctrl + C , todos os processos naquele grupo receberiam um SIGINT.

    
por 16.05.2017 / 22:11