簡體   English   中英

C ++中的基本信號處理

[英]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

我建議查看此鏈接 ,其中提供了有關注冊信號的詳細信息。

除非我弄錯了,要記住的一件重要事情是對象內的任何函數都需要一個引用參數,這意味着非靜態成員函數不能是信號處理程序。 我相信你需要將它注冊到靜態成員函數或某種全局函數。 從那里,如果你有一個特定的對象函數,你想要處理你的更新,你需要一種方法來引用該對象。

有幾種可能性; 實施所有這些並不一定有點過分:

  • 響應特定信號,就像C一樣。 C ++的工作方式相同。 請參閱signal()的文檔。
  • 觸發某些文件更改的修改時間戳,如數據庫存儲在平面文件中。
  • 每小時觸發一次,或每天觸發一次(無論什么都有意義)。

您可以定義與OS信號對應的Boost信號,並將Boost信號連接到您的插槽以調用相應的處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM