Opções para lidar com um sinal?

Opções para lidar com um sinal?

Da APUE

Um processo tem três opções para lidar com um sinal.

  1. 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.

  2. Deixe a ação padrão ocorrer. Para uma condição de divisão por zero, o padrão é encerrar o processo.

  3. 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.

  1. 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?

  2. 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_IGNargumento da signal()chamada do sistema.

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.

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_IGNe 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.

informação relacionada