C++ 在不中断IO的情况下处理信号
如何通过进程捕获信号,并对其进行处理,使当前正在进行的IO输出不会中断 这可以通过调用C++ 在不中断IO的情况下处理信号,c++,io,signals,C++,Io,Signals,如何通过进程捕获信号,并对其进行处理,使当前正在进行的IO输出不会中断 这可以通过调用exitSignalHandling中的所有注册回调handleExit()来实现,直到一个handleExit()返回一个状态,表明它处理了退出信号。如果已将信号标记为处理退出,则在objectB中处理该信号,当流程当前位于需要特别注意的相关功能内时,即为这种情况: void exitSignalHandling(){ /** call all registered callbacks */ } w
exitSignalHandling
中的所有注册回调handleExit()
来实现,直到一个handleExit()
返回一个状态,表明它处理了退出信号。如果已将信号标记为处理退出,则在objectB中处理该信号,当流程当前位于需要特别注意的相关功能内时,即为这种情况:
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注册的所有对象的holder类 有不同的方法可以做到这一点。您可以使用
bool handleExit()=0的抽象类代码>方法。另一种解决方案是将处理程序方法与std::bind(&class::handler,this)
绑定,并将其存储在容器中
当启动/结束信号不间断I/O时,需要向保持器注册/注销处理程序对象。我认为使用动态多态性是最简单的方法
我还必须声明,你的想法并没有经过深思熟虑。如果我调用handleExit
,我会得到一个值,不管之前是否已经设置了exit。我看不出它有什么用处。但这是个小问题
最吸引我的是exit
call的使用。使用这种方式结束应用程序不是很明智。假设有两个对象在发出中断信号时进行不间断的I/O。只有第一个对象会完成,第二个对象仍然会被第一个对象的exit
调用杀死
一般来说,我认为最好创建一个类来负责所有信号处理,并在没有I/O挂起时决定终止应用程序。任何发送的信号都会中断正在进行的IO。你对此无能为力。您需要在while循环中包装IO调用,并测试errno==EINTR
。您是否遇到XY问题?您的用例是什么?信号通常是特定于操作系统的(即使C11标准稍微提到它们)。对于Linux,请阅读并