【发布时间】:2012-02-23 22:27:26
【问题描述】:
这个问题更多的是出于我个人的好奇心,而不是任何重要的事情。我试图让我的所有代码至少与 Windows 和 Mac 兼容。到目前为止,我已经知道我的代码应该基于 POSIX,这很好,但是......
Windows 没有sigaction 函数所以使用signal?根据:
What is the difference between sigaction and signal?信号有些问题。
- 当当前处理程序正在执行时,signal() 函数不会阻止其他信号到达; sigaction() 可以阻塞其他信号,直到当前处理程序返回。
- signal() 函数将几乎所有信号的信号操作重置为 SIG_DFL(默认)。这意味着 signal() 处理程序必须重新安装自身作为其第一个操作。它还会在检测到信号和重新安装处理程序之间打开一个漏洞窗口,在此期间,如果信号的第二个实例到达,则会发生默认行为(通常终止,有时会带有偏见 - 也称为核心转储)。
如果两个 SIGINT 快速出现,则应用程序将以默认行为终止。有没有办法解决这种行为?这两个问题对例如想要阻止 SIGINT 的进程有什么其他影响?在使用信号时我可能会遇到任何其他问题吗?我该如何解决?
【问题讨论】:
-
为什么要在游戏中使用信号?
-
在支持
sigaction的平台上,您可以#define HAVE_SIGACTION。然后检查该定义,如果未定义HAVE_SIGACTION,则创建一个新定义 (#define my_signal signal),如果已定义,则使用sigaction创建一个新函数 (my_signal(...))。
标签: c++ windows macos cross-platform signals