如何编写跨平台的C++代码来处理信号?

4
这个问题更多是出于我的好奇心,而不是什么重要的事情。我想让我的代码至少在Windows和Mac上兼容。到目前为止,我已经了解到我应该基于POSIX来编写代码,这很好,但是...
Windows没有sigaction函数,所以使用signal?根据What is the difference between sigaction and signal?,signal存在一些问题。
  1. 当当前处理程序正在执行时,signal()函数不会阻止其他信号到达;sigaction()可以阻止其他信号直到当前处理程序返回。
  2. signal()函数将信号动作重置为SIG_DFL(默认)几乎对所有信号都适用。这意味着signal()处理程序必须首先重新安装自身。它还在信号被检测到和处理程序重新安装之间打开了一个漏洞窗口,在此期间,如果第二个信号实例到达,则会发生默认行为(通常是终止,有时带有偏见-也称为核心转储)。
如果两个SIGINT快速到达,则应用程序将以默认行为终止。有没有办法修复这个行为?这两个问题对于例如想要阻止SIGINT的进程有什么其他影响?我在使用signal时还会遇到其他问题吗?如何解决它们?

1
你为什么想在游戏中使用信号呢? - selbie
1
在支持sigaction的平台上,可以#define HAVE_SIGACTION。然后,你可以检查该定义,如果未定义,则创建一个新的定义(#define my_signal signal),否则使用sigaction创建一个新函数(my_signal(...))。 - Some programmer dude
1个回答

5

你真的不想处理signal()。

你要用“事件”。

理想情况下,你会找到一个框架,它可以在你希望定位的所有主要环境中使用——这将决定你对“事件”实现的选择。

这里有一个有趣的线程可能会有所帮助:

游戏对象之间的通信

PS: signal()和sigaction()的主要区别在于,sigaction()是“signal()”的升级版——更多的选项,允许SA_RESTART等。我不建议使用任何一个,除非你确实非常需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接