2011-05-10 83 views
1

爲處理SIGINT信號而創建的函數被卡在一個常量循環中。這個想法是讓父進程忽略CTRL-C,但發送給子進程(並且它們將它作爲默認進行處理)。當按CTRL-C時,會發生什麼情況,信號處理函數被調用,但陷入無限循環。 kill調用應該發送SIGTERM到進程組中的所有進程,發送進程除外。任何幫助,將不勝感激。信號處理程序函數保持循環

功能代碼爲:

void intHandler(int signum) { 
kill(0, SIGTERM); 

}

函數調用代碼(主)是:

(void) sigset(SIGINT, intHandler); 
+0

「發件人進程除外」 - 規範沒有這麼說。您需要阻止SIGTERM,或者從進程組中刪除進程。 – 2011-05-10 02:47:30

+0

或在全球範圍內跟蹤孩子,明確地「殺死」孩子而不是所有進程。 IIRC,您還可以使用'sigaction'來確保父母忽略'SIGTERM'並在孩子中解除封鎖。 – 2011-05-10 02:55:58

+0

我完成了你所說的完全符合我所需要的工作。謝謝 – zetatr 2011-05-10 03:11:01

回答

2

從殺手冊頁。

如果pid爲0,則sig應發送給進程組ID等於發送者進程組ID的所有進程(不包括未指定的一組系統進程),並且進程有權爲發送信號。

一無所知的信號不發送給發件人,所以你很可能希望類似:

void intHandler(int signum) { 
    sigset(SIGINT, SIG_DFL); 
    kill(0, SIGTERM); 
} 

這將在發送復位信號處理程序在發送SIGTERM到所有成員之前默認進程組。

+0

啊,我明白了。那麼代碼仍然不會終止父進程呢?我需要父進程繼續並終止子進程。 – zetatr 2011-05-10 03:03:44

+0

決定使用全局變量來跟蹤子進程pid。 – zetatr 2011-05-10 03:11:49

+0

嗯,重置SIGINT信號處理程序不會阻止SIGTERM殺死進程。 – 2011-05-10 06:09:22