Na APUE, capítulo 12 da página 454, é mencionado que:
Para evitar um comportamento errôneo, uma thread deve bloquear os sinais que está esperando...
O semelhante é dito na norma:
Os sinais definidos por set devem ter sido bloqueados no momento da chamada para sigwait() ; caso contrário, o comportamento é indefinido.
Que comportamento errôneo/indefinido está sendo discutido nesses textos? Não consigo encontrar uma justificativa ou uso de aplicativo no padrão e estou tendo dificuldade em compreender a explicação no livro:
se os sinais não estiverem bloqueados ..., uma janela de temporização é aberta onde um dos sinais pode ser entregue ao thread antes de concluir sua chamada para
sigwait
.
Isso é da documentação do qnx , mas é relevante para todas as distribuições do tipo Unix e Unix:
Essa resposta primeiro leva os leitores à perspectiva histórica do desenvolvimento de padrões, depois chama a atenção dos leitores para textos específicos do padrão para explicar o motivo do requisito.
No XPG Edição 3,
sigaction
, juntamente comsig*set
,sigismember
,sigpending
,sigprocmask
esigsuspend
, são introduzidos para alinhamento com o padrão POSIX.1-1988. Destes,sigaction
forneceu a interface mais abrangente e consistente para especificar disposições de sinal;sigpending
,sigprocmask
esigsuspend
forneceu maneiras de resposta refinada aos sinais.No XPG Issue 4 (o mais antigo atualmente disponível em formato digital),
sigaltstack
,sig{hold,ignore,pause,relse,set}
,siginterrupt
foram introduzidos. O padrão mais recente não disse de onde eles eram, apenas que todos, massigaltstack
são obsoletos, pois funcionam apenas em processos de thread único.No XPG Edição 5, que é a Especificação Unix Única Versão 2,
pthread_sigmask
,sigqueue
,sigtimedwait
,sigwaitinfo
, esigwait
são introduzidos para alinhamento com extensões POSIX em tempo real e threads.Agora, é importante olhar para outros 2 lugares no padrão.
1º em Informações Gerais para o volume Interfaces do Sistema, Conceitos de Sinal:
Obviamente, além de eventualmente ignorar o sinal, o sinal pode ter 2 maneiras de alcançar o processo/thread - sendo desbloqueado ou sendo aceito por
sigwait
(e seus irmãos comosigtimedwait
esigwaitinfo
)2º em
sigaction
:Obviamente,
sigwait
tinha sido concebido como um método secundário de processamento de sinais.Isso é confirmado pelo seguinte texto na justificativa para a interface
sigtimedwait
e :sigwaitinfo