Suponha que em main
I registre 2 manipuladores de sinal para SIGUSR1
e SIGUR2
, digamos sig_ur1
e sig_ur2
. O que vai acontecer quando o sinal SIGUR2
chegar quando sig_ur1
estiver funcionando?
sig_ur1
executando ----> sinal SIGUR2
chega ----> :
sig_ur1
continua rodando ->sig_ur1
termina ->sig_ur2
começa a rodar ->sig_ur2
termina -> retorna paramain
sig_ur2
começa a ser executado ->sig_ur2
termina -> retorna paramain
sig_ur2
começa a ser executado ->sig_ur2
termina ->sig_ur1
restaura (as variáveis mantêm o mesmo valor quando sãosig_ur1
deixadas) ->sig_ur1
termina -> retorna paramain
sig_ur2
começa a executar ->sig_ur2
termina ->sig_ur1
reinicia (todas as variáveis são inicializadas novamente) ->sig_ur1
termina -> retorna paramain
Qual opção é a correta? Ou nenhum está correto? Não encontrei nenhum artigo/post falando sobre isso, portanto, fornecer qualquer material/links relacionado seria muito apreciado. :)
Por padrão, o cenário 3 é o que acontece. No entanto, você pode prever o bloqueio do SIGUSR2 sempre que executar o manipulador do SIGUSR1 e, portanto, você teria o cenário 1 ocorrendo. Ao instalar o manipulador de um sinal, você pode especificar quais sinais deseja bloquear enquanto executa o manipulador desse sinal.
Como referência, recomendo que você leia as páginas de manual do seu sistema operacional sobre sinais. Por exemplo, no Linux, você pode começar de
man 7 signal
e a partir daí as páginas de manual VEJA TAMBÉM.No entanto, você pode facilmente verificar o comportamento por si mesmo: basta fazer um manipulador para SIGUSR1 que vai para um longo sono(3) (no Linux é melhor nanosleep(2) porque sleep(3) pode ser implementado através de SIGALRM), então envie primeiro SIGUSR1 e então SIGUSR2.