0

我正在编写一个需要拦截系统信号(例如 SIGINT)的多线程程序。我想知道是否有一种标准化的方式来“捕捉”这些信号,例如:

  • 发送了一个信号,任何线程都可以接收它还是只有 main() 一个?
  • 是否有指定如何处理此问题的 Posix 规则或编程习惯用法?
4

2 回答 2

5

保证只有一个线程接收信号,但也不确定是哪个线程。

正确的做法是阻塞除一个以外的所有线程上的信号,以便该线程单独处理信号处理;或者在 Linux 上特别阻塞线程并设置一个 signalfd 来捕获信号——这样,你不会引入任何异步,信号只是一个要读取的文件描述符。

于 2012-11-07T12:37:22.533 回答
1

既然你问过 POSIX,来自 man signal(7)

POSIX.1 区分了指向整个进程的信号和指向单个线程的信号的概念。 根据 POSIX.1,进程导向的信号(例如,使用 kill(2) 发送)应该由进程中的一个任意选择的线程处理

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

于 2012-11-07T12:42:51.263 回答