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

时间:2015-01-16 15:42:18

标签: c++ io signals

如何通过进程捕获信号,处理它以使当前正在进行的IO输出不被中断?

这可以通过调用handleExit()中所有已注册的回调exitSignalHandling来实现,直到一个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) }
    }
}

1 个答案:

答案 0 :(得分:2)

很明显,问题是通过处理信号,您将退出对象上下文并返回静态C代码。

您需要做的是重新输入对象上下文,例如单例类或全局变量。此类将充当为信号不间断I / O注册的所有对象的持有者类。

有不同的方法可以做到这一点。您可以使用带有bool handleExit() = 0;方法的抽象类。其他解决方案是将处理程序方法与std::bind(&class::handler, this)绑定并将其存储在容器中。

当您开始/结束信号不间断I / O时,您需要使用持有者注册/取消注册您的处理程序对象。我认为使用动态多态将是最简单的方法。

我还必须说明你的想法并非完全是经过深思熟虑的。如果我调用handleExit,我会得到一个值,退出是否已经设置过。我没有看到任何使用它。但这是一个小问题。

最让我感兴趣的是使用exit电话。使用这种结束应用程序的方式并不是很明亮。想象一下,当中断信号到来时,你会有两个对象进行不间断I / O.只有第一个完成,第二个仍然会在第一个对象的exit调用过程中被杀死。

一般来说,我认为创建一个负责所有信号处理的类并决定在没有I / O挂起时终止应用程序会更好。