这是一个非常基本的场景,但我找不到太多有用的资源.我有一个在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`.