我有errflag
处理程序。它为整个程序设置变量:select()
。当我SIGINT
并且errflag
被中断时,我会检查SIGINT
以查看它是errflag
(将自己的常量分配给errflag
)。但是,处理程序可能会延迟,errflag
尚未设置。如何在select()
处理程序解析之前推迟处理?或者如何正确实现这个?
此外,在一个代码路径中-1
在Ctrl-C上返回errno
,EINTR
为select()
。处理程序永远不会迟到。在其他路径中-1
返回errno
,EINTR
也是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
检查已经执行。
答案 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()
可能会导致不一致,混乱的结果;输出不应该被用作程序实际发生情况的可靠指标!