Escolhas para lidar com um sinal?

0

De APUE

A process has three choices for dealing with a signal.

  1. Ignore the signal. This option isn’t recommended for signals that denote a hardware exception, such as dividing by zero or referencing memory outside the address space of the process, as the results are undefined.

  2. Let the default action occur. For a divide-by-zero condition, the default is to terminate the process.

  3. Provide a function that is called when the signal occurs (this is called ‘‘catching’’ the signal). By providing a function of our own, we’ll know when the signal occurs and we can handle it as we wish.

  1. Acho que há apenas duas opções - as duas últimas listadas acima e ambos podem "ignorar o sinal" (a primeira escolha listada acima).

    O meu entendimento é correto, ou existem três escolhas não sobrepostas como na citação? Por quê?

  2. O livro menciona que a ação padrão de algum sinal é ignore isto. Significa que a ação do sinal é SIG_IGN ou SIG_DFL ou uma função vazia? Por exemplo:

    The default action for SIGCHLD is to be ignored. We describe these options in Chapter 10.

    SIGCONT: The default action is to continue a stopped process, but to ignore the signal if the process wasn’t stopped.

Obrigado.

    
por Tim 31.05.2018 / 05:56

1 resposta

3

É claro que é possível escrever um manipulador de sinal que não faz nada e, assim, efetivamente ignorar o sinal, mas a primeira opção é ignorar especificamente o sinal usando o argumento SIG_IGN da chamada do sistema signal() .

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

  • signal(SIGINT, SIG_IGN); para ignorar
  • Para não chamar a função signal() ou chamá-la com signal(SIGINT, SIG_DFL); e, assim, deixar a ação padrão ocorrer, 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: link

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. Criar uma função de manipulador vazia provavelmente não terá um efeito visível, além de uma sobrecarga (pequena).

NOTA: O signal() é usado nesta resposta para simplificar, mas no novo código sigaction() é recomendado por razões de portabilidade.

    
por 31.05.2018 / 06:08

Tags