暂停()信号处理程序

pause() signal handler

pause() 函数阻塞,直到信号到达。 假设进程收到信号并返回 pause(),信号处理程序是否会在 之前 执行 pause() 调用之后的代码,或者结果是意外的?

示例:

void sigusr1_handler() 
{
   // .. handler code
}

void main() 
{
   // .. bind handler to SIGUSR1

   pause(); // wait for SIGUSR1
   // some more code
}

"some more code" 是否总是在 sigusr1_handler() 完成后执行,或者存在竞争条件?如果是,解决方案是什么?
除了忙等我什么也想不出来,不过这样就根本不需要暂停了..

引自the man page for pause(2)

pause() returns only when a signal was caught and the signal-catching function returned. In this case, pause() returns -1, and errno is set to EINTR.

您可以确定您的信号处理程序在 some more code 之前运行。

信号处理程序不会运行并发;它们中断处理它们的线程,中断的流程仅在信号处理程序 returns.

时继续

但是,您的示例可能还有其他竞争条件;只有稀疏的伪代码而不是对您的用例的完整解释,很难说。例如,一个不同的信号可能会在您的信号出现之前到达并中断 pause,然后您的处理程序可能会比您预期的晚 运行 结束。

有几个 "right ways" 可以代替:

  • write 一个字节到信号处理程序中的 pipe,并在主要执行流程中从它 read
  • sem_post 来自信号处理程序的信号量,sem_wait 在主要执行流程中。
  • 使用 sigwaitinfosigtimedwait 而不是信号处理程序。
  • 仍然使用pause,但在一个循环中:

    while(!signal_handler_finished) pause();
    

    其中 signal_handler_finished 的类型为 volatile sig_atomic_t,并在信号处理程序中设置为非零值。