当前位置: 首页 > 面试题库 >

Linux中具有多个线程的信号处理

乜建柏
2023-03-14
问题内容

在Linux中,当程序(可能具有多个线程)接收到诸如SIGTERM或SIGHUP之类的信号时会发生什么?

哪个线程拦截信号?多个线程可以得到相同的信号吗?有专门用于处理信号的特殊线程吗?如果不是,那么在处理信号的线程内部会发生什么?信号处理程序例程完成后,如何恢复执行?


问题答案:

根据您所使用的Linux内核版本,这会有些许细微差别。

假设有2.6个posix线程,并且如果您正在谈论操作系统正在发送SIGTERM或SIGHUP,则信号将发送到进程,由根线程接收并处理。使用POSIX线程,您也可以将SIGTERM发送到各个线程,但是我怀疑您是在询问操​​作系统将信号发送到进程时会发生什么。

在2.6中,SIGTERM将导致子线程“干净地”退出,在2.4中,子线程处于不确定状态。



 类似资料:
  • 在Linux中,当一个程序(可能有多个线程)收到信号(如SIGTERM或SIGHUP)时会发生什么? 哪个线程拦截信号?多个线程可以获得相同的信号吗?是否有专门处理信号的特殊线程?如果没有,那么处理信号的线程内部会发生什么?信号处理程序例程完成后,执行如何继续?

  • 问题内容: 这应该非常简单,并且令我感到惊讶的是,我还没找到关于stackoverflow的答案。 我有一个类似程序的守护程序,该程序需要响应SIGTERM和SIGINT信号才能与新贵一起正常工作。我读到最好的方法是在与主线程不同的线程中运行程序的主循环,并让主线程处理信号。然后,当接收到信号时,信号处理程序应通过设置通常在主循环中检查的哨兵标志来告诉主循环退出。 我已经尝试过这样做,但是它没有按

  • 问题内容: 我有两个共享库链接到我的测试应用程序。这两个库都具有的信号处理程序。 同一信号具有多个信号处理程序是否有效?生成信号时,处理程序将执行哪个顺序? 问题答案: 正如其他人所说,只能设置一个信号处理程序,这是最后一个。然后,您将不得不自己管理调用两个函数。该函数可以返回以前安装的信号处理程序,您可以自己调用该信号处理程序。 这样的东西(未经测试的代码):

  • 问题内容: 我有2个线程(线程1和线程2)。而且我有信号处理。每当发生线程2时,都应处理该信号。为此,我写了下面的程序 我编译并运行该程序。每1秒打印一次“ thread1 active”,每3秒打印一次“ thread2 active”。 现在我生成了。但是它会像上面那样显示“ thread1 active”和“ thread2 active”消息。再次生成了,现在每3秒仅打印一次“ threa

  • 我正在开发基于spring+Hibernate的web应用程序。在这个应用程序中,我必须对数据库中的50000个可用记录进行计算。当前逻辑:- 循环0到50000(所有50000记录彼此独立) 选择第i个元素 对第i个元素执行计算(删除CALCULATION_TEMP表(如果存在),创建新表CALCULATION_TEMP并在CALCULATION_TEMP表中插入计算) 在步骤3表上进行一些计算

  • 问题内容: 我有一个程序,该程序可以创建许多线程并运行,直到关闭嵌入式计算机的电源,或者用户使用或终止该过程为止。 这是一些代码以及main()的外观。 我想知道几件事: 是否需要信号处理? 我在这个线程中读到“ Linux C为正常终止捕获了终止信号” ,显然,操作系统将为我处理清理工作。因此,我可以仅用无限循环替换信号处理程序,然后让OS正常退出线程,取消分配内存等吗? 关于干净终止,还有其他