
Da APUE
Um processo tem três opções para lidar com um sinal.
Ignore o sinal. Esta opção não é recomendada para sinais que denotam uma exceção de hardware, como divisão por zero ou referência à memória fora do espaço de endereço do processo, pois os resultados são indefinidos.
Deixe a ação padrão ocorrer. Para uma condição de divisão por zero, o padrão é encerrar o processo.
Forneça uma função que seja chamada quando o sinal ocorrer (isso é chamado de ''capturar'' o sinal). Ao fornecer uma função própria, saberemos quando o sinal ocorre e poderemos tratá-lo como desejarmos.
Acho que existem apenas duas opções - as duas últimas listadas acima, e ambas podem "ignorar o sinal" (a primeira opção listada acima).
Meu entendimento está correto ou existem de fato três opções não sobrepostas, como na citação? Por que?
O livro menciona que a ação padrão de algum sinal é ignorá-lo. Isso significa que a ação do sinal é SIG_IGN ou SIG_DFL ou uma função vazia? Por exemplo:
Opadrãoação para o SIGCHLD deve serignorado. Descrevemos essas opções no Capítulo 10.
SIGCONT: O padrão ação é continuar um processo parado, mas ignoraro sinal se o processo não foi interrompido.
Obrigado.
Responder1
É claro que é possível escrever um manipulador de sinal que não faça nada e, portanto, efetivamente ignore o sinal, mas a primeira opção é ignorar especificamente o sinal usando o SIG_IGN
argumento da signal()
chamada do sistema.
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 processo signal(SIGINT, termination_handler);
, ondetermination_handler()
é uma função que é chamada na primeira vez que o sinal ocorre.
Fonte:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
Para o caso específico de sinais onde a ação padrão é ignorar o sinal, as duas primeiras opções ( SIG_IGN
e SIG_DFL
) são idênticas. A criação de uma função de manipulador vazia provavelmente não terá um efeito visível, exceto uma (pequena) sobrecarga.
NOTA: O signal()
é usado nesta resposta por simplicidade, mas no novo código sigaction()
é recomendado por motivos de portabilidade.