我正在编写一个需要拦截系统信号(例如 SIGINT)的多线程程序。我想知道是否有一种标准化的方式来“捕捉”这些信号,例如:
- 发送了一个信号,任何线程都可以接收它还是只有 main() 一个?
- 是否有指定如何处理此问题的 Posix 规则或编程习惯用法?
保证只有一个线程接收信号,但也不确定是哪个线程。
正确的做法是阻塞除一个以外的所有线程上的信号,以便该线程单独处理信号处理;或者在 Linux 上特别阻塞线程并设置一个 signalfd 来捕获信号——这样,你不会引入任何异步,信号只是一个要读取的文件描述符。
既然你问过 POSIX,来自 man signal(7)
POSIX.1 区分了指向整个进程的信号和指向单个线程的信号的概念。 根据 POSIX.1,进程导向的信号(例如,使用 kill(2) 发送)应该由进程中的一个任意选择的线程处理。
所以简而言之,这意味着将选择一个随机线程来处理信号。