为什么忽略信号()或sigaction()忽略信号处理程序

Why is a signal handler I establish with signal() or sigaction() ignored?

本文关键字:信号处理 程序 sigaction 为什么 信号      更新时间:2023-10-16

我有以下问题:我想在我的raspberry pi 3(带有最近的raspbian)运行时捕获SIGINT(以及后来的SIGTERMsignals为了在我停止(C 11)程序时进行一些清理(尤其是关闭与USB设备的连接)。首先,我尝试了signal (),但是信号处理程序从未启动过。

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

信号manpage建议改用sigaction()。好的,我接受了本教程将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
}

我一直在运行您的代码。我只添加了缺少的标题,并且它可以工作,信号挂式机被调用。