如何确保信号处理程序完成,然后才继续编程?

时间:2016-10-02 17:23:08

标签: c select signals race-condition

我有errflag处理程序。它为整个程序设置变量:select()。当我SIGINT并且errflag被中断时,我会检查SIGINT以查看它是errflag(将自己的常量分配给errflag)。但是,处理程序可能会延迟,errflag尚未设置。如何在select()处理程序解析之前推迟处理?或者如何正确实现这个?

此外,在一个代码路径中-1在Ctrl-C上返回errnoEINTRselect()。处理程序永远不会迟到。在其他路径中-1返回errnoEINTR也是errflag,但处理程序稍后输出日志消息并且迟到,我的select e.EmpID, concat(e.FName, ' ', e.LName) as Name, o.HireDate, o.BasicPay, s.Scale, SUM(a.amount) as totalAllowance, SUM(d.Amount) as totalDeduction from tblEmployee e, tblEmpOfficialDetail o, tblScale s, tblAllowance a, tblDeduction d where e.EmpID = o.EmpID and o.ScaleID = s.ID and o.ScaleID = a.ScaleID and o.ScaleID = d.ScaleID group by e.EmpID, e.FName, e.LName, o.HireDate, o.BasicPay, s.Scale 检查已经执行。

1 个答案:

答案 0 :(得分:3)

  

但是,处理程序可能会延迟,errflag尚未设置。

呃,什么?不,它不会迟到"。这里还有别的错误。

信号处理程序中断正常程序流 - 当收到SIGINT时,处理程序运行,并且当信号处理程序退出时,控制流仅释放到程序的其余部分。

您需要确保errflag被声明为volatile,以便编译器不会对其值何时发生变化做出过度假设。

您还需要记住的是printf()在信号处理程序中使用是不安全的,因为它可能使用全局缓冲区,在信号处理期间可能会处于不一致状态。 Generally speaking, very few things are safe to do during a signal handler besides setting volatile global variables or exiting.尝试在信号处理程序中使用printf()可能会导致不一致,混乱的结果;输出不应该被用作程序实际发生情况的可靠指标!