【问题标题】:use of signals with POSIX threads on linux在 Linux 上使用带有 POSIX 线程的信号
【发布时间】:2015-10-07 10:51:07
【问题描述】:

可以在每个线程的基础上设置信号掩码,但是信号句柄呢?如果我在使用pthread_create() 创建新线程之前调用sigaction(),新线程会获得相同的信号处理程序吗?如果我在pthread_create() 之后使用sigaction(),那会改变整个进程的信号处理程序还是只改变线程的处理程序?

【问题讨论】:

标签: linux multithreading signals


【解决方案1】:

每个进程只有一个信号处理程序。所以线程在这里与任何类型都不相关。在接收信号的线程上下文中调用信号处理程序。如果多个线程没有阻塞信号,则不指定哪个线程接收信号。

如果有多个线程在系统调用中等待,您必须小心。此外,您还必须注意使用计时器操作和调用睡眠。

您可能还会发现此答案很有帮助:POSIX threads and signals

【讨论】:

  • 好的,谢谢您的回答。信号是异步传递还是延迟传递? pthread_cancel() 可以 tweeked,但是 pthread_kill() 呢?我读到该信号确实使用取消点,但它们甚至可以中断系统调用。
  • The signal handler is called in its own context which is non of the threads one. - 没有。根据man signal(7)A process-directed signal may be delivered to any one of the threads that does not currently have the signal blocked.
  • @Kouros 几乎每个系统调用都会被信号中断。所以你必须检查返回值。如果处理了信号,通常会返回EINTR
  • @Klaus,所以信号默认是异步的,唯一让它们延迟的方法是阻塞它们然后调用sigwait()。 @Tsyvarev,那不是我的问题
  • 对不起,我犯了一个错误:我读到与pthread_cancel() 不同的信号不使用取消点,因此它们可以中断库甚至系统调用(除非它们被pthread_sigmask() 阻止)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多