信号处理程序和本地状态
Signal handler and local state
我在 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()
存在该功能。您可以获取一个常用的文件描述符并轮询它(使用select
或epoll
)以获取传入信号。因此,当您处理信号时,它们没有任何适当的限制 - 它只是通常的用户空间代码,因此您可以调用任何您想要的内容...... - 据我所知,对于OS X,kqueue中也存在类似的功能(搜索此站点或Internet以获取
EVFILT_SIGNAL
和kqueue
)
相关文章:
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 选择"Y"继续后,我的程序一直处于关闭状态
- 程序终止,状态为 -1073741510 在 for 循环的中间,将输入分配给二维数组
- 用于unique_ptr的有状态自定义删除程序
- Windows编程:为什么我们要将lParam转换为CREATESTRUCT来获取应用程序状态
- 检查特定应用程序的窗口是否处于最小化状态
- 如何在Windows C MFC应用程序状态栏中禁用CAP NUM SCRL指示器
- 从基本C/CPP Linux应用程序中展示状态信息
- 程序在cmd中工作,在cygwin中立即以状态127退出,在emacs shell中没有输出
- 我的链接列表程序在代码块编译器(X0000000005)中以状态-1073741819终止
- 信号处理程序和本地状态
- 当应用程序变为活动/非活动状态时获取通知
- 视图状态和应用程序设计
- 程序状态和调试器不一致
- 如何将有限状态机集成到我的应用程序中
- 当使用信号处理程序触发事件时,如何使boost.msm正确更改状态
- 有没有办法让控制台窗口在程序完成后保持打开状态,并在按键1次后关闭
- 简单c++程序Id的问题返回1退出状态
- MFC:如果程序以前在最大化状态下关闭,则'Maximized Button'错误