[英]Basic signal handling in C++
這是一個非常基本的場景,但我找不到太多有用的資源。 我有一個在Linux上運行的C ++程序,用於執行文件處理。 讀取行,進行各種轉換,將數據寫入數據庫。 有一些變量(存儲在數據庫中)影響我每次迭代時正在讀取的處理,因為我希望處理盡可能最新,但稍有滯后就可以了。 但是這些變量很少變化,並且隨着時間的推移讀取成本很高(每天1000萬行)。 我可以將讀取空間分配給每n次迭代,或者只是在變量發生變化時重新啟動程序,但這些似乎是hackish。
我想要做的是讓程序在收到SIGHUP時觸發重新讀取變量。 我正在閱讀的有關信號處理的一切都在談論C信號庫,我不知道如何配合我的程序類。 Boost信號庫似乎更多地是關於對象間通信而不是處理OS信號。
有人可以幫忙嗎? 看起來這應該非常簡單,但我對C ++很生疏。
我會處理它,就像你可以在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
。
我建議查看此鏈接 ,其中提供了有關注冊信號的詳細信息。
除非我弄錯了,要記住的一件重要事情是對象內的任何函數都需要一個引用參數,這意味着非靜態成員函數不能是信號處理程序。 我相信你需要將它注冊到靜態成員函數或某種全局函數。 從那里,如果你有一個特定的對象函數,你想要處理你的更新,你需要一種方法來引用該對象。
有幾種可能性; 實施所有這些並不一定有點過分:
signal()
的文檔。 您可以定義與OS信號對應的Boost信號,並將Boost信號連接到您的插槽以調用相應的處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.