C++中的基本信号处理

Ker*_*elM 12 c++ signals

这是一个非常基本的场景,但我找不到太多有用的资源.我有一个在Linux上运行的C++程序,用于执行文件处理.读取行,进行各种转换,将数据写入数据库.有一些变量(存储在数据库中)影响我每次迭代时正在读取的处理,因为我希望处理尽可能最新,但稍有滞后就可以了.但是这些变量很少变化,并且随着时间的推移读取成本很高(每天1000万行).我可以将读取空间分配给每n次迭代,或者只是在变量发生变化时重新启动程序,但这些似乎是hackish.

我想要做的是让程序在收到SIGHUP时触发重新读取变量.我正在阅读的有关信号处理的一切都在谈论C信号库,我不知道如何配合我的程序类.Boost信号库似乎更多地是关于对象间通信而不是处理OS信号.

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

Joh*_*ter 16

我会处理它,就像你可以在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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您想要符合标准,请确保将您的信号处理程序限定为`extern"C"` (4认同)