例如:
说我在main()中有一个信号处理程序,用于处理计时器警报。我也有main创建的工作线程,这些线程没有此信号处理程序,因为信号所需的逻辑包含在main中。我相信这将是一个问题,因为如果在发送信号时当前有一个工作线程正在运行,它将捕获信号并且没有所需的信号处理程序来处理它。但是在每个可能的上下文中包含每个相关的自定义信号处理程序的定义似乎有些过头。我想念什么吗?
答案 0 :(得分:2)
说我在main()中有一个信号处理程序,用于处理计时器警报。
不,你不知道。信号处理程序是一个函数,而C没有有意义的含义,一个函数可以在另一个函数内部。
我还有main创建的工作线程,它们没有此信号处理程序,因为信号所需的逻辑包含在main中。
信号处理(包括自定义处理程序)是进程范围的属性。在同一进程的不同线程中,同一信号不能有不同的配置。而且,不,用于处理信号的逻辑是在其信号处理程序中(如果有的话),或者在内核中(如果没有)。进程可用的功能也是每个进程的属性,而不是每个线程的属性。
我认为这将是一个问题,因为如果在发送信号时当前有一个工作线程正在运行,它将捕获该信号,并且没有所需的信号处理程序来处理它。
不一定,不是。
每个线程都有其自己的信号掩码,该掩码控制可以向其传递哪些信号。线程从其父线程继承其信号掩码,然后可以通过pthread_sigmask()
函数修改该掩码。这样,您可以控制信号处理程序在哪个线程中运行,以及至少同样重要的是,哪些线程可以被信号中断,因此信号不一定要传递到您的工作线程中。
但是也不是,正如我已经讨论的那样,各个线程在任何情况下都没有单独的信号处理程序。每个线程都具有该进程具有的所有信号处理程序,因为它们属于该进程而不是单个线程。
但是在每个可能的上下文中包含每个相关的自定义信号处理程序的定义似乎是过大的。我想念什么吗?
是的。我不确定确切缺少哪些部分,但请参见上文。
答案 1 :(得分:0)
信号处理程序是 code ,它被所有线程共享,因为所有线程共享进程的内存空间。因此,不可能“没有信号处理程序”。
现在,可能可以从信号处理程序链接到在一个特定线程中运行的代码,这是您的程序需要通过设计代码和数据结构来处理的。
假设您对posix / linux系统感兴趣,可以使用pthread_sigmask
在每个线程的基础上屏蔽信号。因此,一种常见的解决方案是在所有线程中阻止信号,除了那些期望处理它们的线程。
某些信号本质上是特定于线程的(例如浮点异常和分段违规)。有关更多信息,请参见signal(7)
手册页。