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

Handling Signal without interrupting IO

本文关键字:情况下 处理 信号 IO 中断      更新时间:2023-10-16

如何通过进程捕获信号,处理它以使当前正在进行的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 挂起时决定终止应用程序。