C 睡眠指导不';不要使用信号处理器

C 睡眠指导不';不要使用信号处理器,c,linux,signals,sleep,C,Linux,Signals,Sleep,此代码需要注册到signalSIGCHLD,然后休眠3秒,然后退出 此代码跳过睡眠指令,为什么?在底部列出了以下属性: void handler ( int sig, siginfo_t * info, void * se) { } int setup_sig(){ struct sigaction sa; sa.sa_sigaction = handler; sa.sa_flags = SA_SIGINFO; sigfillset(&sa.sa_ma

此代码需要注册到signal
SIGCHLD
,然后休眠3秒,然后退出

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

在底部列出了以下属性:

void handler ( int sig, siginfo_t * info, void * se)
{

}

int 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 0;} return 1;
}

void main()
{
    printf("before\n");
    setup_sig();
    sleep(3);
    printf("after\n");
}
在这种情况下,
sig:sigchd/linux
非常重要。根据,解释如下(我的重点):

sig
:将sig标记为MT安全问题的功能可能会临时安装一个用于内部目的的信号处理器,这可能会干扰在冒号后识别的信号的其他用途

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

可以使用
sigprocmask
调用阻塞信号,例如:

┌──────────┬───────────────┬─────────────────────────────┐
│Interface │ Attribute     │ Value                       │
├──────────┼───────────────┼─────────────────────────────┤
│sleep()   │ Thread safety │ MT-Unsafe sig:SIGCHLD/linux │
└──────────┴───────────────┴─────────────────────────────┘

正确格式和缩进的代码比这里的代码更容易阅读和理解。因此它不会等待3秒钟?编译器应该拒绝
setup\u sig()
;不能从返回类型为
void
的函数中返回值(另请参见,其中引用了标准的相关部分)。单独-答案不是
void
,可能在Windows上除外。我们可以提供完整的标题、编译器标志、无编译警告,以及您期望的行为与您观察到的行为的详细描述吗?像@user253751一样,我不太清楚你所说的睡眠“不工作”或代码“跳过睡眠指令”是什么意思。那么我该如何实现它呢?@paramikooo,我想粗体文本已经清楚地说明了这一点,我会详细说明。
// Need signal.h for this stuff.

sigset_t mask;

if ((sigemptyset(&mask) == -1) || (sigaddset(&mask, SIGCHLD) == -1)) {
    // handle failure here.
}

if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
    // handle failure here.
}

sleep(3);

// Probably need to re-establish CHLD signal handler as well as unmasking.

if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1) {
    // handle failure here.
}