我在Unix上使用C ++。
假设我有一个长时间运行的功能,例如从文件中读取内容并解析它。在这个函数中,我会在局部变量num_read
中记录我从文件中读取的内容。
我想在自定义信号处理程序中捕获CTRL + c并打印num_read
的值。
我能想到的唯一方法是在堆上分配num_read
并将其地址存储在可由我的信号处理程序访问的全局变量中。有更优雅的方式吗?
答案 0 :(得分:3)
答案是否定的。有没有之间的通信方式 信号处理程序和除全局之外的其余代码 变量
此外,你只能做非常非常有限的事情
信号处理程序。您无法在<<
上使用std::ostream
,
例如,你也不能打电话给printf
。通常的方式
在Unix下处理信号是为了单独捕获它们
线。替代方案(适用于其他操作系统)是
定义sig_atomic_t
的全局变量,设置为。{
信号处理程序,并在主循环中轮询。 (在你的情况下,
例如,您可以在每次更新时轮询它
num_read
。)
答案 1 :(得分:2)
除了使用信号处理程序的传统Unix方法之外,还有其他方法:
signalfd()
函数。您可以获取通常的文件描述符并对其进行轮询(使用select
或epoll
)以获取传入信号。因此,当您处理信号时,没有任何适当的限制 - 它只是通常的用户空间代码,因此您可以调用任何您想要的... EVFILT_SIGNAL
和kqueue
搜索此网站或互联网)