Como podemos configurar uma armadilha de sinal para ser SIG_IGN e SIG_DFL no bash?

Como podemos configurar uma armadilha de sinal para ser SIG_IGN e SIG_DFL no bash?

Dehttps://unix.stackexchange.com/a/447032/674

Então em termos de código, assumindo o SIGINTsinal, estas são as três opções:

  • signal(SIGINT, SIG_IGN);ignorar
  • Não chamar a signal()função, ou chamá-la com signal(SIGINT, SIG_DFL);e assim deixar ocorrer a ação padrão, ou seja, encerrar o processo
  • signal(SIGINT, termination_handler);, onde termination_handler()é uma função que é chamada na primeira vez que o sinal ocorre.

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

trap "" INT

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

Quando o bash executa um comando externo, ele redefinirá as armadilhas de sinal para o padrão e manterá os sinais ignorados ainda ignorados. Portanto, é importante saber como configurar um manipulador de sinal para estar SIG_IGNno bash e se definir um manipulador de sinal para o comando vazio ""é o mesmo que configurá-lo para SIG_IGN.

Pergunta semelhante sobre como configurar uma armadilha de sinal para estar SIG_DFLno bash.

Obrigado.

Responder1

Da documentação POSIX deo utilitário especial integradotrap:

Se action for -, o shell deverá redefinir cada condição para o valor padrão. Se a ação for nula ( ""), o shell deverá ignorar cada condição especificada, caso ela surja. Caso contrário, a ação do argumento deverá ser lida e executada pelo shell quando surgir uma das condições correspondentes.

Isso significa que seu script, depois de trap "" INT, irá ignorar o INTsinal e que você poderá redefinir a armadilha para o padrão com trap - INT.

Responder2

Eu peguei esse script:

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

E correu:

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

Entre a saída, 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

Dada a sa_handler=SIG_IGNprimeira chamada rt_sigaction()e sa_handler=SIG_DFLa segunda, parece que trap "" INTestá bashrealmente ignorando o sinal e trap - INTredefinindo-o para o manipulador padrão.

informação relacionada