Sleep指令不适用于信号处理程序

问题描述 投票:1回答:1
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秒钟,然后熄灭。

此代码跳过睡眠指令,为什么?

c linux signals sleep
1个回答
1
投票

Linux documentation for sleep在底部列出以下属性:

sleep

┌──────────┬───────────────┬─────────────────────────────┐ │Interface │ Attribute │ Value │ ├──────────┼───────────────┼─────────────────────────────┤ │sleep() │ Thread safety │ MT-Unsafe sig:SIGCHLD/linux │ └──────────┴───────────────┴─────────────────────────────┘ 在此情况下很重要。根据sig:SIGCHLD/linux,解释如下(我强调):

[here:标有sig的MT安全性问题的功能可能会出于内部目的临时安装信号处理程序,这可能会干扰以冒号标识的信号的其他用途。

通过确保在通话过程中不会发生信号的其他使用,可以解决此安全问题。在调用使用同一临时信号的所有函数时,持有非递归互斥体; 建议在调用之前阻止该信号,然后再重置其处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.