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

问题描述 投票:0回答:2

我遇到了以下问题:当我的代码在 Raspberry Pi 3(带有最新的 Raspbian)上运行时,我想捕获

SIGINT
(以及后来的
SIGTERM
signals
,以便执行一些操作当我停止我的 (C++ 11) 程序时进行清理(特别是关闭与 USB 设备的连接)。首先,我尝试了
signal ()
,但信号处理程序从未启动。相反,我在点击 ^C:

后在控制台上收到了此消息
2017-02-26 17:13:17 sigHandler: Unhandled signal 2, terminating

信号手册页建议使用

sigaction()
代替。好的,我用 thistutorial
signal()
替换为
sigaction()
,但没有用,处理程序从未被调用。在阅读了一堆其他教程(例如这个)之后,我最终得到了这个代码片段:

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
}
c++ signals raspberry-pi3
2个回答
0
投票

我一直在运行你的代码。我只添加了缺少的标头,并且它有效,信号悬挂器被调用。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.