确保当sigsuspend返回时将调用信号处理程序

时间:2020-11-08 04:00:22

标签: c signals

假设我为SIGALRM设置了以下信号处理程序:

volatile sigatomic_t alarm_flag;

void alarm_handler(int signum)
{
    (void)signum;
    alarm_flag = 1;
}

然后假设我调用了alarm,然后输入了一段代码,其中SIGALRM被阻止,但是我想与其同步。也就是说,我要使用sigsuspend等待警报到期:

sigfillset(&set);
sigdelset(&set, SIGALRM);
sigsuspend(&set);
some_other_command();

是否有POSIX保证在执行alarm_handler时将调用some_other_command还是我需要执行以下操作?

sigsuspend(&set);
while ( !alarm_flag );
some_other_command();

1 个答案:

答案 0 :(得分:1)

摘自sigsuspend()的POSIX文档:

如果要执行信号捕获功能,则sigsuspend()将在信号捕获功能返回后返回,并且信号掩码恢复到sigsuspend()调用之前已存在的集合

是的,有保证。如果您没有在SIGALARM中阻止sigsuspend(),则至少(当然,并假设在调用警报之前未处理警报)。