2015-01-16 35 views
0

如何通过进程捕获信号并对其进行处理,以便当前正在进行的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) } 
    } 
} 

回答

1

很明显嘛,问题是,通过处理一个信号,你退出对象上下文并回到静态C代码。

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

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

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

我也必须说明你的想法并不完全透彻。如果我拨打handleExit,我会得到一个值,不管是否已经设置了退出。我没有看到它的任何用处。但这是一个小问题。

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

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