Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不中断IO的情况下处理信号_C++_Io_Signals - Fatal编程技术网

C++ 在不中断IO的情况下处理信号

C++ 在不中断IO的情况下处理信号,c++,io,signals,C++,Io,Signals,如何通过进程捕获信号,并对其进行处理,使当前正在进行的IO输出不会中断 这可以通过调用exitSignalHandling中的所有注册回调handleExit()来实现,直到一个handleExit()返回一个状态,表明它处理了退出信号。如果已将信号标记为处理退出,则在objectB中处理该信号,当流程当前位于需要特别注意的相关功能内时,即为这种情况: void exitSignalHandling(){ /** call all registered callbacks */ } w

如何通过进程捕获信号,并对其进行处理,使当前正在进行的IO输出不会中断

这可以通过调用
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,请阅读并