Como podemos configurar um sinal de interceptação para ser SIG_IGN e SIG_DFL no bash?

3

De link

So in terms of code, assuming the SIGINT signal, these are the three options:

  • signal(SIGINT, SIG_IGN); to ignore
  • To not call the signal() function, or to call it with signal(SIGINT, SIG_DFL); and thus to let the default action occur, i.e. to terminate the process
  • signal(SIGINT, termination_handler);, where termination_handler() is a function that is called the first time the signal occurs.

No bash, como posso configurar o manipulador de um sinal como SIG_IGN ?

trap "" INT

define um comando vazio "" como o manipulador de sinal. Mas isso realmente define o manipulador como SIG_IGN ?

Quando o bash executa um comando externo, ele reinicializa os traps de sinal e mantém os sinais ignorados ainda ignorados. Portanto, é importante saber como configurar um manipulador de sinal para ser SIG_IGN no bash e se a configuração de um manipulador de sinal para o comando vazio "" é o mesmo que defini-lo como SIG_IGN .

Pergunta semelhante sobre como configurar um sinal de interceptação para ser SIG_DFL no bash.

Obrigado.

    
por Tim 01.06.2018 / 02:07

2 respostas

3

A partir da documentação POSIX do o utilitário interno especial trap :

If action is -, the shell shall reset each condition to the default value. If action is null (""), the shell shall ignore each specified condition if it arises. Otherwise, the argument action shall be read and executed by the shell when one of the corresponding conditions arises.

Isso significa que seu script, após trap "" INT , irá ignorar o sinal INT e que você pode redefinir a interceptação para o padrão com trap - INT .

    
por 01.06.2018 / 07:43
1

Eu peguei este script:

#!/bin/bash
trap "" INT
trap - INT

E corri:

$ strace bash script.sh 2>&1 | grep INT

Entre os resultados, vejo:

read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0

Dado o sa_handler=SIG_IGN na primeira chamada para rt_sigaction() e o sa_handler=SIG_DFL no segundo, parece que trap "" INT está causando bash a realmente ignorar o sinal, e trap - INT está fazendo com que redefinir para o manipulador padrão.

    
por 01.06.2018 / 04:24