在不中断 IO 的情况下处理信号
Handling Signal without interrupting IO
如何通过进程捕获信号,处理它以使当前正在进行的IO输出不会中断?
这可以通过调用exitSignalHandling
handleExit()
的所有注册回调来实现,直到一个handleExit()
返回一个状态,告诉它处理了退出信号。如果信号已被标记为处理出口,则在对象B中处理信号,当进程当前位于需要特别注意的相关功能中时,就是这种情况:
void exitSignalHandling(){
/** call all registered callbacks */
}
while(1){
objectB.compute();
objectA.write(some data) /* when process enters: set flag to handle exit signal , objectB registered a call back objectB::handleExit()*/
}
class objectA{
bool handleExit(){
if( handleExit == true){
exitAfterWrite = true;
return true;
}
return false;
}
write(){
handleExit=true;
/*write data*/
if(exitAfterWrite){ exit(SUCCESS) }
}
}
很明显,问题在于通过处理信号,您将退出对象上下文并返回到静态 C 代码。
您需要做的是使用单例类或全局变量等重新输入对象上下文。此类将充当为信号不间断 I/O 注册的所有对象的持有者类。
有不同的方法可以做到这一点。您可以使用bool handleExit() = 0;
方法使用抽象类。另一种解决方案是将处理程序方法与std::bind(&class::handler, this)
绑定并将其存储在容器中。
当您开始/结束信号不间断 I/O 时,您需要向持有者注册/注销处理程序对象。我认为使用动态多态性是最简单的方法。
我还必须声明,你的想法并不完全是经过深思熟虑的。如果我调用handleExit
,我会得到一个值,无论之前是否已经设置了退出。我看不出它有任何用处。但这是一个小问题。
最让我感兴趣的是exit
调用的使用。使用这种结束应用程序的方式不是很明亮。想象一下,当中断信号出现时,您将有两个对象执行不间断的 I/O。只有第一个会完成,第二个仍然会被第一个对象的exit
调用杀死。
通常,我认为最好创建一个负责所有信号处理的类,并在没有 I/O 挂起时决定终止应用程序。
相关文章:
- 在双重继承的情况下如何处理非标准构造函数
- 在C++不使用 POW 的情况下处理负指数
- STL:在没有输出的情况下处理两个集合
- 在这种情况下,我将如何继续 1 到 360 的"for loop"处理指针和地址?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 为什么在某些特定情况下具有多个线程(并行处理)会降低性能
- 如何在不调用 "-m" 选项的情况下自动化 git 提交来处理内部引号?
- 如何在锁定互斥锁的情况下处理主线程中的信号
- 为什么在指针和数组的情况下,字符数组的处理方式不同
- 在多个继承的情况下,C 编译器如何处理成员变量内存偏移
- 在操作员过载的情况下处理悬空指针/参考
- 如何在不继承手柄的情况下分叉处理
- 处理POSIX信号:如何在不使用BackTrace_symbols的情况下获取堆栈跟踪
- 如何在不同情况下处理具有多个法线的顶点
- 在不中断 IO 的情况下处理信号
- 在之前不知道消息长度的情况下处理阻塞的 recv() 函数,并且不想使用 asy I/O
- 如何在不将代码放入头文件的情况下处理任何迭代器
- 如何在不使代码庞大的情况下处理共享/弱ptr ?
- c++:可以在不知道std::_Container_base是map还是vector的情况下处理它吗?