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

How to ensure that signal handler finished and only then continue program?

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

此外,在 Ctrl-C 上的一个代码路径 select() returns -1 中,errnoEINTR。这里的处理程序永远不会迟到。在其他路径 select() returns -1, errno 也是 EINTR, 但是 handler 输出日志信息晚了一点,我的 errflag 检查已经执行了。

However, the handler can be late and errflag isn't yet set.

呃,什么?不,不可能是 "late"。这里还有其他问题。

信号处理程序会中断正常的程序流 -- 当收到 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() 可能会导致不一致、混乱的结果;不应将输出用作程序中实际发生情况的可靠指标!