信号处理程序和本地状态

时间:2012-12-18 09:09:14

标签: c++ unix signals

我在Unix上使用C ++。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

  • 因为Linux内核2.6.22存在signalfd()函数。您可以获取通常的文件描述符并对其进行轮询(使用selectepoll)以获取传入信号。因此,当您处理信号时,没有任何适当的限制 - 它只是通常的用户空间代码,因此您可以调用任何您想要的...
  • 就我所知的OS X而言,kqueue中存在类似的功能(在EVFILT_SIGNALkqueue搜索此网站或互联网)