void handler ( int sig, siginfo_t * info, void * se)
{
}
void setup_sig(){
struct sigaction sa;
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
sigfillset(&sa.sa_mask);
if(-1 == sigaction(SIGCHLD, &sa , NULL)){return FALSE;} return TRUE;
}
void main()
{
printf("before\n");
setup_sig();
sleep(3);
printf("after\n");
}
此代码需要注册以发送信号到SIGCHLD
,然后休眠3秒钟,然后熄灭。
此代码跳过睡眠指令,为什么?
Linux documentation for sleep
在底部列出以下属性:
sleep
┌──────────┬───────────────┬─────────────────────────────┐
│Interface │ Attribute │ Value │
├──────────┼───────────────┼─────────────────────────────┤
│sleep() │ Thread safety │ MT-Unsafe sig:SIGCHLD/linux │
└──────────┴───────────────┴─────────────────────────────┘
在此情况下很重要。根据sig:SIGCHLD/linux
,解释如下(我强调):
[here:标有sig的MT安全性问题的功能可能会出于内部目的临时安装信号处理程序,这可能会干扰以冒号标识的信号的其他用途。
通过确保在通话过程中不会发生信号的其他使用,可以解决此安全问题。在调用使用同一临时信号的所有函数时,持有非递归互斥体; 建议在调用之前阻止该信号,然后再重置其处理程序。