2012-11-07 179 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)发送)应由处理中的单个任意 选定线程处理。

所以简而言之,这意味着将选择一个随机线程来处理信号。