
Dehttps://unix.stackexchange.com/a/447032/674
Então em termos de código, assumindo o
SIGINT
sinal, estas são as três opções:
signal(SIGINT, SIG_IGN);
ignorar- Não chamar a
signal()
função, ou chamá-la comsignal(SIGINT, SIG_DFL);
e assim deixar ocorrer a ação padrão, ou seja, encerrar o processosignal(SIGINT, termination_handler);
, ondetermination_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_IGN
no 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_DFL
no 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 INT
sinal 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_IGN
primeira chamada rt_sigaction()
e sa_handler=SIG_DFL
a segunda, parece que trap "" INT
está bash
realmente ignorando o sinal e trap - INT
redefinindo-o para o manipulador padrão.