【问题标题】:handling of 2 signals at aproximately the same time大约同时处理 2 个信号
【发布时间】:2012-11-22 05:11:21
【问题描述】:

在 Linux 2.6 中,我希望我的进程同时捕获 SIGHUP 和 SIGTERM 以便有序退出。

当节点关闭时,日志显示它将首先处理 SIGHUP(父进程收到 SIGTERM)或 SIGTERM。

我的问题是:是否有可能同时调用这些信号的处理程序?还是内核一个接一个地触发?

【问题讨论】:

  • 关于第一个问题,我认为你不能那样做。但是关于第二个问题,您可以在处理程序中为 SIGHUP 执行 raise(SIGTERM),反之亦然。当然,您应该检查您是否没有来其他处理程序。
  • 澄清一下:进程在关闭时会同时收到 SIGHUP 和 SIGTERM,因为它们会因关闭而收到 SIGTERM,并且因为父进程也会收到并死掉。

标签: c linux signals


【解决方案1】:

根据您的代码架构,您可以强制同步读取信号以防止任何并发问题。您可以使用 signalfd,然后在您想检查任何未完成的信号时从该 fd 中读取。如果您需要它们使用信号处理程序以异步默认方式运行,我认为您必须为信号处理程序可能被中断做好准备。

man signalfd

【讨论】:

    【解决方案2】:

    在给进程的异步信号中,Linux 内核通过系统调用向目标进程结构发送信号,当进程的上下文切换到 RUN 状态时,信号由根线程处理,并在所有其他线程上阻塞信号。由于每个线程的堆栈空间不同,因此可以一次处理每个信号(如果错误则更正)。

    【讨论】:

    • @AndresVelascoGarcia 如果是进程,信号处理程序不应该按顺序执行,从内核读取每个信号。如有错误请指正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多