如何确保信号处理程序完成,然后才继续程序?
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
中,errno
是 EINTR
。这里的处理程序永远不会迟到。在其他路径 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()
可能会导致不一致、混乱的结果;不应将输出用作程序中实际发生情况的可靠指标!
我有 SIGINT
处理程序。它为整个程序设置变量:errflag
。当我执行 select()
并通过 SIGINT
中断时,我检查 errflag
以查看它是否为 SIGINT
(将自己的常量分配给 errflag
)。但是,处理程序可能会延迟并且 errflag
尚未设置。如何在 errflag
的处理程序决议之前推迟处理?或者如何正确实施?
此外,在 Ctrl-C 上的一个代码路径 select()
returns -1
中,errno
是 EINTR
。这里的处理程序永远不会迟到。在其他路径 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()
可能会导致不一致、混乱的结果;不应将输出用作程序中实际发生情况的可靠指标!