为什么我用signal()或sigaction()建立的信号处理程序被忽略了?

时间:2017-02-26 16:33:05

标签: c++ signals raspberry-pi3

我遇到了以下问题:当我的代码在我的Raspberry Pi 3上运行时,我希望抓住SIGINT(以及后来SIGTERM} signals最近的Raspbian)当我停止我的(C ++ 11)程序时,为了做一些清理(特别是关闭USB设备的连接)。首先我尝试了signal (),但是信号处理程序从未踢过。相反,我在点击^ C后在我的控制台上收到了这条消息:

2017-02-26 17:13:17 sigHandler: Unhandled signal 2, terminating

signal manpage建议改为使用sigaction()。好的,我用this tutorialsignal()替换为sigaction(),但没有用,处理程序永远不会被调用。在阅读了一堆其他教程(如this one)之后,我最终得到了这段代码:

void OnSignalCaught (int signal)
{
  cout << "Exited." << endl;
  exit (signal);
}

int main ()
{
  struct sigaction exit_action;
  struct sigaction old_action;
  int              ret;

  sigemptyset (&exit_action.sa_mask);

  exit_action.sa_handler = OnSignalCaught;
  exit_action.sa_flags   = 0;
  ret                    = sigaction (SIGINT, &exit_action, &old_action);

  if (ret < 0) cout << "Creating signal handler failed! Error code: " << errno << "." << endl;

// remainder of the code goes here
}

1 个答案:

答案 0 :(得分:0)

我一直在运行你的代码。我只添加了丢失的标题,它可以工作,信号挂机被调用。