2015-01-16 41 views
0

如何通過進程捕獲信號並對其進行處理,以便當前正在進行的IO輸出不會中斷?處理信號而不會中斷IO

這可以通過調用exitSignalHandling中的所有已註冊的回調handleExit()直到一個handleExit()返回一個狀態,告訴它處理退出信號。如果它已經被標記爲處理退出的信號在對象B處理,這樣的話,當進程當前需要特殊護理的相關函數內部:

void exitSignalHandling(){ 
    /** call all registered callbacks */ 

} 
while(1){ 
    objectB.compute();  
    objectA.write(some data) /* when process enters: set flag to handle exit signal , objectB registered a call back objectB::handleExit()*/ 
} 

class objectA{ 
    bool handleExit(){ 
     if(handleExit == true){ 
     exitAfterWrite = true; 
     return true; 
     } 
     return false; 
    } 

    write(){ 
     handleExit=true; 
     /*write data*/ 
     if(exitAfterWrite){ exit(SUCCESS) } 
    } 
} 

回答

1

很明顯嘛,問題是,通過處理一個信號,你退出對象上下文並回到靜態C代碼。

您需要做的是用例如重新輸入對象上下文。單例類或全局變量。該類將作爲註冊信號不間斷I/O的所有對象的持有者類。

有這樣做的不同方式。您可以使用帶有bool handleExit() = 0;方法的抽象類。其他解決方案將綁定處理器方法與std::bind(&class::handler, this)並將其存儲在一個容器中。

當您開始/結束信號不可中斷I/O時,您需要向持有者註冊/取消註冊處理程序對象。我認爲使用動態多態是最簡單的方法。

我也必須說明你的想法並不完全透徹。如果我撥打handleExit,我會得到一個值,不管是否已經設置了退出。我沒有看到它的任何用處。但這是一個小問題。

最讓我感興趣的是使用exit來電。使用這種方式結束應用程序不是很明亮。想象一下,在中斷信號出現時,您將有兩個對象進行不間斷I/O。只有第一個完成,第二個仍然會被第一個對象的exit調用一路殺死。

通常,我認爲創建一個負責所有信號處理的類並決定在沒有I/O掛起時終止應用程序會更好。