2012-11-07 178 views
0

我在編寫一個需要攔截系統信號(如SIGINT)的多線程程序。我想知道是否有一種標準化的方式來「捕捉」這些信號,例如:線程和系統信號

  • 信號被髮送,可能是任何線程接收到它或只有main()?
  • 是否有一個Posix規則或編程習慣用法指定了如何處理?
+0

如果沒有線程阻塞任何信號,任何線程都可能收到任何信號。一次接收信號或從不接收每個過程。引用'* never *':對於連續發送的相同類型的所有信號,除了第一個可能被操作系統吞噬掉。進一步閱讀:'man sigaction' – alk

+0

這裏有一篇文章,裏面有描述Linux信號的例子。 http://www.thegeekstuff.com/2012/03/catch-signals-sample-c-code/ –

+0

閱讀實際的系統調用'信號(2)'也會很有成效。 – eh9

回答

5

這是保證正好一個線程接收該信號,但也未指定其中線程是。

正確的做法是阻止除一個線程之外的所有線程的信號,以便該線程單獨處理信號處理;或者在Linux上專門阻止任何地方的線程並設置一個signalfd來捕獲信號—那樣,你不會引入任何異步性,並且信號只會成爲一個多讀取的文件描述符。

1

既然你問到POSIX,從人signal(7)

POSIX.1區分的被引導到 過程作爲一個整體和信號定向到個人 線程的信號的概念。 根據POSIX.1,處理指導信號(例如,使用 kill(2)發送)應由處理中的單個任意 選定線程處理。

所以簡而言之,這意味着將選擇一個隨機線程來處理信號。