2011-10-31 79 views
0

我不確定我是否試圖將一個方形的釘子粘到圓孔中,但我試圖使用信號來協調五個或六個子過程與他們的父項。我有父設置來處理這些信號C中的信號進程間通信 - 爲什麼會失敗?

signal(1, SigControllerCarWaiting1); 
signal(2, SigControllerCarWaiting2); 
signal(3, SigControllerCarWaiting3); 
signal(4, SigControllerCarWaiting4); 
signal(5, SigControllerCarWaiting5); 

signal(6, SigControllerCarEnter1); 
signal(7, SigControllerCarEnter2); 
signal(8, SigControllerCarEnter3); 
signal(9, SigControllerCarEnter4); 
signal(10, SigControllerCarEnter5); 

而且它主要工作。當我運行我的程序時,它會多次按預期完成。但有些時候,它將無法覆蓋默認行爲,並且我的父進程會輸出類似'Hangup'的內容,然後終止....讓一堆子仍在執行。

我試圖重新建立的處理程序,如信號...

void SigControllerCarWaiting5() { signal(5, SigControllerCarWaiting5); SigControllerCarWaiting(4); } 
void SigControllerCarWaiting4() { signal(4, SigControllerCarWaiting4); SigControllerCarWaiting(3); } 
void SigControllerCarWaiting3() { signal(3, SigControllerCarWaiting3); SigControllerCarWaiting(2); } 
void SigControllerCarWaiting2() { signal(2, SigControllerCarWaiting2); SigControllerCarWaiting(1); } 
void SigControllerCarWaiting1() { signal(1, SigControllerCarWaiting1); SigControllerCarWaiting(0); } 

但它似乎並沒有產生影響。有時它運行得很好;其他時候,它會失敗,信號文本並殺死父母。我對這一切都很陌生,認爲有人可以指出我正確的方向。除了'signal(ID,Function)以外,還有什麼東西可以用來捕獲多個輸入信號?

如果我只用一個子進程運行它,它永遠不會失敗。所以我認爲這與兒童之間的種族差異有關......但我無法在追蹤中取得任何進展。

編輯

經過進一步調查,我發現使用的sigaction而不是信號推薦網站...但我似乎仍然有同樣的問題。有時,信號不會被我處理,並導致我的過程提前結束。

+1

[在c,linux中使用信號的進程間同步]可能的重複(http://stackoverflow.com/questions/6200225/interprocess-synchronization-using-signals-in-c-linux) –

+0

爲什麼你不使用管道或信號量,還是沿着這些線? –

+1

始終檢查系統調用的返回值;這樣做會告訴你信號9(SIGKILL)沒有改變。 –

回答

1

生活和學習...

當使用信號;如果兩個孩子同時發送相同的信號,第一個孩子會被我的處理程序處理,但第二個孩子會在處理程序重新建立自己作爲處理程序之前執行,從而導致默認行爲發生。

更改爲sigaction確實阻止了此操作。但是,某些信號仍然「失敗」(特別是9或SIGKILL,因爲系統不允許您覆蓋SIGKILL行爲)。

所以,我的解決方案是使用sigaction 不使用SIGKILL進行我自己的自定義通信。

除此之外;正如其他人所建議的那樣,管道或信號量將成爲這種情況下更好的工具。