正确的信号处理和中断

时间:2013-10-03 17:17:05

标签: c signals interrupt

对于正在侦听信号的正在运行的进程的中断有疑问。下面是我的处理程序。 SIGHUP用于重新加载我的配置文件,SIGCHLD用于在它产生的进程上使用nohang进行waitpid,其他用于终止进程。

void sig_handler( int sig, siginfo_t *siginfo, void *ucontext )
{
    if ( sig == SIGHUP ) {
        reload = 1;
    } else if( sig == SIGCHLD) {
        // TODO
    } else if ( sig == SIGTERM || sig == SIGKILL || sig == SIGINT ) {
        done = 1;
    }
}

do {
    if(reload) {
        // opening files, doing file descriptor stuff
        ... // processing...
        **SIHUP OCCURS! WHAT HAPPENS?** <<<<<<<<<<< Line: 505 <<<<<<<<<<<<<<<<<<
        ... // processing...
    }
} while(!done);

我目前对信号的理解:

    发生
  • 信号
  • 在线505上完成当前操作。即:打开(“t.txt”);
  • 运行信号处理程序代码以完成
  • 返回第505行并继续

我担心的是:

    发生
  • 信号
  • 打破当前代码
  • 运行信号处理程序代码以完成
  • 继续突破代码

问题:

  1. 我是否应该在重新加载配置时增强我的代码以阻止SIGHUP,SIGTERM,SIGCHLD,以便在信号出现时我没有不稳定的代码?或者那是否过度设计? (假设之后没有恢复)
  2. 说我在SIGHUP的信号处理程序中,但随后出现SIGHUP信号,会发生什么? (我假设它将它们排队并运行处理程序两次)
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

实际上,如果发生信号,则在调用信号处理程序之前,您当前的操作不一定会完成。但是,完成信号处理程序后,您的代码将从信号中断时的确切位置恢复。并且由于你的所有信号处理程序都设置了一个标志变量,因此对当前正处于其他任何事情中间的代码没有任何影响。

<强>数目:

  1. 为什么要这么麻烦?您的代码之后恢复,并且任何设计合理的信号处理程序都不会破坏代码的稳定性。
  2. 文档似乎表明第二个信号的处理将推迟到第一个处理程序完成。有关详细信息,请参阅this question