【问题标题】:Basic signal handling in C++C++ 中的基本信号处理
【发布时间】:2010-09-28 23:00:26
【问题描述】:

这是一个非常基本的场景,但我没有找到太多有用的资源。我有一个在 Linux 中运行的 C++ 程序,它进行文件处理。读取行,进行各种转换,将数据写入数据库。某些变量(存储在数据库中)会影响我当前在每次迭代中读取的处理,因为我希望处理尽可能保持最新,但稍微滞后是可以的。但是这些变量很少改变,并且随着时间的推移读取成本很高(每天超过 1000 万行)。我可以将读取间隔到每个 n 次迭代,或者在变量更改时简单地重新启动程序,但这些看起来很hackish。

我想做的是让程序在收到 SIGHUP 时触发重新读取变量。我正在阅读的有关信号处理的所有内容都在谈论 C 信号库,我不确定如何将其与我的程序类联系起来。 Boost 信号库似乎更多的是关于对象间通信而不是处理 OS 信号。

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

【问题讨论】:

    标签: c++ signals


    【解决方案1】:

    我会像在 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;
    }
    

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

    【讨论】:

    • 哦,呵呵。我完全想多了,忘记了信号变量是我想要的,而不是直接调用。 总台
    • 如果您想符合标准,请确保将您的信号处理程序限定为extern "C"
    • @R Samuel:这很好。我什至没有考虑过extern "C",因为我正在编写 C 代码,但是 OP 需要它!
    【解决方案2】:

    我建议您查看this link,它提供了有关注册信号的详细信息。

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

    【讨论】:

    • 该网站看起来已关闭,因此您可能需要查看this link 了解详情。
    • 不,cplusplus.com(和那个链接)对我来说似乎还不错。不过有多个参考资料总是好的。
    【解决方案3】:

    有几种可能性;实施所有这些不一定是大材小用:

    • 响应特定信号,就像 C 一样。 C++ 的工作方式相同。请参阅signal() 的文档。
    • 触发某些文件更改的修改时间戳,例如存储在平面文件中的数据库。
    • 每小时触发一次,或每天触发一次(只要有意义)。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 2011-01-29
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多