4

我在 Unix 上使用 C++ 工作。

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

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

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

4

2 回答 2

4

答案是不。除了通过全局变量外,信号处理程序和其余代码之间没有任何通信方式

此外,您只能在信号处理程序中做非常非常有限的事情。例如,您不能在 a<<上使用 a std::ostream,也不能调用printf。在 Unix 下处理信号的常用方法是在单独的线程中捕获它们。另一种方法(也适用于其他操作系统)是定义一个全局变量sig_atomic_t,它在信号处理程序中设置,并在主循环中轮询。(例如,在您的情况下,您可能会在每次 update 时轮询它 num_read。)

于 2012-12-18T09:36:55.813 回答
3

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

  • 由于 Linux 内核 2.6.22 存在signalfd()功能。您可以获得一个常用的文件描述符并轮询它(使用selectepoll)以获取传入信号。所以当你处理一个信号时,它们没有任何限制——它只是普通的用户空间代码,所以你可以调用任何你想要的......
  • 据我所知,对于 OS X,kqueue 中存在类似的功能(在此站点或互联网上搜索EVFILT_SIGNALand kqueue
于 2012-12-18T12:39:07.003 回答