【问题标题】:How to reset SIGINT to default after pointing it some user-defined handler for some time?将 SIGINT 指向一些用户定义的处理程序一段时间后,如何将其重置为默认值?
【发布时间】:2011-04-08 09:26:25
【问题描述】:

我使用signal(SIGINT,my_handler)SIGINT 指向my_handler。一段时间后,我想将它重置为它通常指向的任何默认处理程序。我该怎么做?

【问题讨论】:

  • 考虑移植您的代码以使用sigaction(),其中允许保存旧的信号处理配置并在以后正确恢复它。

标签: c++ signals


【解决方案1】:

今天推荐使用sigaction

此外,它允许您在第一次调用自定义处理程序之前自动将信号处理程序重置为默认值。

SA_RESETHAND

如果设置,信号的处置应重置为SIG_DFL,并且 SA_SIGINFO 标志应在进入信号处理程序时被清除。

注意: SIGILLSIGTRAP发货时不能自动复位;系统 默默地执行这个限制。

否则,信号的配置不应在进入 信号处理程序。

此外,如果设置了此标志,sigaction() 的行为可能与 SA_NODEFER 标志也被设置了。

定义一次性信号处理程序

#include <signal.h>
#include <stdio.h>

action.sa_handler = my_handler;
action.sa_flags   = SA_RESETHAND;

if (sigaction(SIGINT, &action, NULL) == -1)
{
  perror("Failed to install signal handler for SIGINT");
}

如果信号处理程序不是使用 sigaction 的一次性处理程序,请参阅这篇文章,了解如何将信号处理程序重置为默认值: https://stackoverflow.com/a/24804019/7044965

【讨论】:

    【解决方案2】:

    SIG_DFL 作为func 参数传递给signal() 以重置默认行为:

    signal(SIGINT, SIG_DFL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多