有没有办法让 Control-C 表现得像抛出异常一样。即基本上程序退出,但在路上所有的析构函数都被调用了吗?
2 回答
好吧,您需要一个信号处理程序来捕获 SIGINT(SIGTERM,HUP 为什么不也是如此?)。您不想将线程用于这样简单的事情,因此请使用标准的“自管道技巧”:将一个字节(信号值)写入信号处理程序中套接字对的一端,以及您的主循环(有总是在某处有一个选择循环)将异步读回该值。就是在那个时候你扔掉,逃跑,按照普通的退出程序,做任何你喜欢的事情。一切都被解开和破坏,就像您在主应用程序循环中因任何其他原因退出一样。
这通常是不可能或很难做到的。我相信在某些系统上,例如 GNU/Linux,如果您-fnon-call-exceptions -fasynchronous-unwind-tables
向 GCC 提供标志(未经测试),您可以这样做。
除了上述之外,您基本上有两种选择:
您可以在信号处理程序中设置某种标志,您将在其他地方检查以查看 SIGINT 是否已交付。这对 *NIX 和 Windows 平台都很有用。
在 *NIX 上,如果您已经在应用程序中使用线程,您可以在单独的线程中使用例如sigwait()作为同步事件来处理 SIGINT,并强制整个应用程序有序终止。
我建议使用第二个选项,因为它也可以用作解决 Windows 上问题的一般方法。Windows 将线程注入到执行用户提供的 Ctrl-C 或 Ctrl-Break 句柄的应用程序中。如果您使用第二个选项,恕我直言,您的应用程序将更便携。