【问题标题】:Proper signal handling and interrupts正确的信号处理和中断
【发布时间】:2013-10-10 12:14:19
【问题描述】:

有一个关于中断正在侦听信号的正在运行的进程的问题。下面是我的处理程序。 SIGHUP 用于重新加载我的配置文件,SIGCHLD 用于在它产生的进程上等待没有挂起的进程,而其他进程则用于终止进程。

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 行完成当前操作。即:open("t.txt");
  • 运行信号处理程序代码以完成
  • 返回第 505 行并继续

我担心的是:

  • 信号出现
  • 跳出当前代码
  • 运行信号处理程序代码以完成
  • 继续破解代码

问题:

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

谢谢!

【问题讨论】:

    标签: c signals interrupt


    【解决方案1】:

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

    答案:

    1. 何必呢?您的代码在之后恢复,并且任何设计合理的信号处理程序都不会破坏代码的稳定性。
    2. 文档似乎表明第二个信号的处理将推迟到第一个处理程序完成。详情请见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多