【问题标题】:How can I write cross platform c++ that handles signals?如何编写处理信号的跨平台 C++?
【发布时间】:2012-02-23 22:27:26
【问题描述】:

这个问题更多的是出于我个人的好奇心,而不是任何重要的事情。我试图让我的所有代码至少与 Windows 和 Mac 兼容。到目前为止,我已经知道我的代码应该基于 POSIX,这很好,但是......

Windows 没有sigaction 函数所以使用signal?根据: What is the difference between sigaction and signal?信号有些问题。

  1. 当当前处理程序正在执行时,signal() 函数不会阻止其他信号到达; sigaction() 可以阻塞其他信号,直到当前处理程序返回。
  2. 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


【解决方案1】:

你真的根本不想处理 signal()。

你想要“事件”。

理想情况下,您会找到一个可移植到您希望定位的所有主要环境的框架 - 这将决定您对“事件”实现的选择。

这是一个有趣的话题,可能会有所帮助:

Game Objects Talking To Each Other

PS: signal() 和 sigaction() 之间的主要区别在于 sigaction() 是类固醇上的“signal()” - 更多选项,允许 SA_RESTART 等。除非你真的非常需要,否则我不建议使用其中任何一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2014-09-28
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多