信号处理程序和本地状态

Signal handler and local state

本文关键字:状态 程序 信号处理      更新时间:2023-10-16

我在 Unix 上C++工作。

假设我有一个长时间运行的函数来做某事,例如从文件中读取内容并解析它。在这个函数中,我记录了我在局部变量num_read中从文件中读取的内容。

我想在自定义信号处理程序中捕获 CTRL+c 并打印 num_read 的值。

我能想到的唯一方法是在堆上分配num_read并将其地址存储在我的信号处理程序可以访问的全局变量中。还有比这更优雅的方式吗?

答案是否定的。 之间没有办法沟通信号处理程序和除全局之外的其余代码变量。

此外,您只能在非常非常有限的情况下执行非常非常有限的事情信号处理程序。 您不能在std::ostream上使用<<,例如,您也不能称printf. 通常的方式在Unix下处理信号是在单独的中捕获它们线。 替代方案(也适用于其他操作系统)是定义全局变量 sig_atomic_t ,该变量在信号处理程序,并在主循环中轮询。 (在您的情况下,例如,您可以在每次更新时轮询它 num_read .)

除了传统的Unix信号处理程序方式外,还有其他:

  • 从 Linux 内核 2.6.22 开始,signalfd()存在该功能。您可以获取一个常用的文件描述符并轮询它(使用 selectepoll )以获取传入信号。因此,当您处理信号时,它们没有任何适当的限制 - 它只是通常的用户空间代码,因此您可以调用任何您想要的内容......
  • 据我所知,对于OS X,kqueue中也存在类似的功能(搜索此站点或Internet以获取EVFILT_SIGNALkqueue