使Control-C表现得像未捕获的异常

时间:2012-11-08 10:16:05

标签: c++

有没有办法让Control-C像抛出异常一样。即基本上程序退出,但在上升的过程中所有的析构函数都被称为?

2 个答案:

答案 0 :(得分:1)

那么,你需要一个信号处理程序来捕获SIGINT(SIGTERM,HUP为什么不呢?)。你不想将线程用于这样简单的事情,所以使用标准的"自管技巧":将一个字节(信号值)写入信号处理程序中socket对的一端,并且你的主循环(那里总是有一个选择循环)将异步读回值。在这一点上,你扔掉,逃跑,遵循普通的戒烟程序,做任何你喜欢的事情。一切都被解开并被破坏,就好像你在主应用程序循环中因为任何其他原因而退出。

答案 1 :(得分:0)

这通常是不可能或很难做到的。我相信在某些系统上,比如GNU / Linux,如果你向GCC提供-fnon-call-exceptions -fasynchronous-unwind-tables标志(未经测试),你就可以这样做。

除上述内容外,您基本上有两种选择:

  1. 要么在信号处理程序中设置某种标志,要在其他地方检查以查看是否已传送SIGINT。这对* NIX和Windows平台都很有用。

  2. 在* NIX上,如果您已在应用程序中使用线程,则可以在单独的线程中使用例如sigwait()处理SIGINT作为同步事件,并强制整个应用程序有序终止。

  3. 我建议使用第二个选项,因为它也可用作Windows上问题的一般方法。 Windows将一个线程注入到执行用户提供的Ctrl-C或Ctrl-Break句柄的应用程序中。如果您使用第二个选项,您的应用程序将更容易移植。