bash manipulação de sinal pai e filho

3

Resumo rápido: pai e filho em um loop, cada um pode capturar ou não capturar sinais. Eu não entendo porque, se a criança armadilha e o pai não, o pai não é terminado.

O detalhe:

Eu tenho dois scripts simples, que apenas executam um loop e, opcionalmente, interceptam o SIGINT e outros sinais. O script filho é iniciado pelo pai.

Pai:

#!/bin/bash

parent_trap=$1
child_trap=$2

shutdown=0

(( parent_trap )) && trap "echo 'parent: caught signal'; shutdown=1" INT TERM HUP PIPE

while (( ! shutdown )) ; do
    echo parent
    ./child $child_trap
    sleep 1
done

Criança:

#!/bin/bash

child_trap=$1

shutdown=0

(( child_trap )) && trap "echo 'child: caught signal'; shutdown=1" INT TERM HUP PIPE

while (( ! shutdown )) ; do
    echo child
    sleep 1
done

Quando estes são executados com as quatro combinações de sinais de interceptação:

sem trapping:

$ ./parent 0 0
parent
child
child
child
^C

pai e filho são ambos terminados por ctrl-c. Pelo que entendi, o shell envia SIGINT para todos os processos no grupo de processos, não há manipuladores, então a ação padrão de terminate é invocada.

pai e filho, ambos trapping:

$ ./parent 1 1
parent
child
child
child
^Cchild: caught signal
parent: caught signal

pai e filho captam o sinal e ambos saem corretamente

pai intercepta sinal, filho não:

$ ./parent 1 0
parent
child
child
child
^Cparent: caught signal

o pai captura o sinal e sai limpo. criança é morta por terminar (eu acho)

filho captura sinal, pai não:

$ ./parent 0 1
parent
child
child
child
^Cchild: caught signal
parent
child
^Cchild: caught signal
parent
child
^Cchild: caught signal
^C

filho intercepta o sinal e sai limpo, mas pai, que não captura o sinal, continua (reativando o filho) até que ctrl-c seja pressionado duas vezes em rápida sucessão.

Por que o pai não é terminado como a ação padrão quando não há manipulador de sinal?

    
por Dave Jennings 02.12.2016 / 03:08

0 respostas

Tags