如何编写处理信号的跨平台c ++?

时间:2012-02-01 07:48:22

标签: c++ windows macos cross-platform signals

这个问题更多的是出于个人的好奇心而不是重要的事情。我试图让我的所有代码至少与Windows和Mac兼容。到目前为止,我已经了解到我应该将我的代码建立在POSIX上,这很棒但是......

Windows没有sigaction功能,因此使用了signal?根据: What is the difference between sigaction and signal?信号存在一些问题。

  
      
  1. 当前处理程序执行时,signal()函数不阻止其他信号到达; sigaction()可以阻止其他信号,直到当前处理程序返回。
  2.   
  3. signal()函数将信号操作重置为几乎所有信号的SIG_DFL(默认值)。这意味着signal()处理程序必须重新安装自己作为其第一个操作。它还会在检测到信号和重新安装处理程序之间打开一个漏洞窗口,在此期间,如果信号的第二个实例到达,则会发生默认行为(通常是终止,有时带有偏见 - 也称为核心转储)。 / LI>   

如果两个SIGINT快速到来,那么应用程序将以默认行为终止。有没有办法解决这个问题?这两个问题对一个过程有什么其他影响,例如想要阻止SIGINT?使用信号时是否还有其他问题?我该如何修理它们?

1 个答案:

答案 0 :(得分:4)

你根本不想处理signal()。

你想要“事件”。

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

这是一个可能有用的有趣线程:

Game Objects Talking To Each Other

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