代码之家  ›  专栏  ›  技术社区  ›  KernelM

C++中的基本信号处理

  •  12
  • KernelM  · 技术社区  · 14 年前

    这是一个非常基本的场景,但我没有找到太多有用的资源。我有一个C++程序,它运行在Linux,可以进行文件处理。读取行,执行各种转换,将数据写入数据库。某些变量(存储在数据库中)会影响我当前在每次迭代中读取的处理,因为我希望处理过程尽可能最新,但稍微滞后是可以的。但是这些变量很少发生变化,而且随着时间的推移,读取的开销也越来越大(一天超过1000万行)。我可以把读数分给每个人

    我想做的是让程序在收到SIGHUP时触发变量的重读。我读到的所有关于信号处理的东西都是关于C信号库的,我不知道如何将它与我的程序类联系起来。Boost信号库似乎更多的是关于对象间通信,而不是处理OS信号。

    有人能帮忙吗?看起来这应该是非常简单的,但是我对C++很生疏。

    4 回复  |  直到 14 年前
        1
  •  16
  •   John Ledbetter    14 年前

    我会像你在C中处理它一样处理它。我认为有一个独立的信号处理函数是非常好的,因为你只需要发布到一个信号量或设置一个变量或类似的东西,其他线程或对象可以检查它来确定它是否需要重新读取设置。

    #include <signal.h>
    #include <stdio.h>
    
    /* or you might use a semaphore to notify a waiting thread */
    static volatile sig_atomic_t sig_caught = 0;
    
    void handle_sighup(int signum) 
    {
        /* in case we registered this handler for multiple signals */ 
        if (signum == SIGHUP) {
            sig_caught = 1;
        }
    }
    
    int main(int argc, char* argv[]) 
    {
        /* you may also prefer sigaction() instead of signal() */
        signal(SIGHUP, handle_sighup);
    
        while(1) {
            if (sig_caught) {
                sig_caught = 0;
                printf("caught a SIGHUP.  I should re-read settings.\n");
            }
        }
    
        return 0;
    }
    

    您可以测试发送 SIGHUP kill -1 `pidof yourapp` .

        2
  •  3
  •   Bryan    14 年前

    我建议退房 this link

    除非我弄错了,否则要记住的一点是,对象中的任何函数都需要引用参数,这意味着非静态成员函数不能是信号处理程序。我相信您需要将它注册到静态成员函数或某种全局函数。从这里开始,如果您有一个特定的对象函数要处理您的更新,您将需要一种方法来引用该对象。

        3
  •  1
  •   wallyk    14 年前

    有几种可能性;实现所有这些可能性并不一定过分:

    • 对特定的信号做出反应,就像C一样。C++的工作原理是一样的。有关详细信息,请参阅文档 signal()
    • 触发某个文件更改的修改时间戳,如存储在平面文件中的数据库。
    • 每小时触发一次,或每天触发一次(任何有意义的)。
        4
  •  0
  •   yasouser    14 年前

    您可以定义一个与OS信号相对应的Boost信号,并将Boost信号绑定到插槽以调用相应的处理程序。