关闭 C++ 控制台应用程序时会发生啥
Posted
技术标签:
【中文标题】关闭 C++ 控制台应用程序时会发生啥【英文标题】:What happens when you close a c++ console application关闭 C++ 控制台应用程序时会发生什么 【发布时间】:2010-10-16 07:36:45 【问题描述】:我想这个问题说明了一切,但是,如果有人关闭了一个 c++ 控制台应用程序会发生什么?如,单击右上角的“x”。它会立即关闭吗?它会引发某种异常吗?是未定义的行为吗?
【问题讨论】:
您对哪个平台感兴趣?视窗? Linux?这确实会影响答案。 “console app”一词的使用意味着 windows,因为这是 MS 对字符模式应用程序的术语。 【参考方案1】:使用右上角的“x”关闭 c++ 控制台应用程序会引发 CTRL_CLOSE_EVENT
,如果您使用 SetConsoleCtrlHandler 函数设置控制处理程序,您可以捕获并处理它。在那里,您可以覆盖关闭功能并执行您想做的任何事情,然后仍然可以选择执行默认行为。
【讨论】:
您无法覆盖关闭控制台。无论您返回TRUE
还是FALSE
,进程都会退出。如果您延迟或返回,例如要进行清理,默认情况下会在您的进程被杀死之前给您 5 秒的时间。即使你手动调用AllocConsole
或AttachConsole
也是一样的,在handler中调用FreeConsole
已经来不及了。如果关闭控制台的用户不应该终止主进程,那么您需要为控制台使用子进程并使用管道连接标准 I/O。【参考方案2】:
我想控制台进程只是被操作系统毫不客气地杀死了。如果你想捕获这个事件并做一些事情,看起来SetConsoleCtrlHandler 函数就是这样做的方法。
另见:
How to handle a ctrl-break signal in a command line interface Console Event Handling【讨论】:
【参考方案3】:在 Linux 和其他 Unix 系统上,控制台作为单独的进程运行。当您关闭 shell 时,它会向当前活动的进程或未在后台执行的进程发送 SIGHUP 信号。如果程序员不处理它,则该过程简单地终止。如果您关闭与终端和活动进程的 SSH 会话,则会发送相同的信号。
【讨论】:
【参考方案4】:SIGBREAK
在 Windows 上引发。
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 当然可以。这是我找到这个页面时想要的答案。SIGBREAK
仅在您使用 C 运行时时引发。 Windows 本身没有 Unix 信号。 C 运行时有一个控制台控制处理程序,将CTRL_C_EVENT
映射到SIGINT
并将所有其他控制事件映射到SIGBREAK
。
@eryksun 好点子。但是,如果您正在使用 C 运行时,那么使用 tutorialspoint.com/cplusplus/cpp_signal_handling.htm 处理 SIGBREAK
是一种处理手动窗口关闭的干净方式。
@DrMcCleod,如果我们使用 C/C++ 的其他实现,它们可能不会实现 SIGBREAK
(它不是标准 C)或将 CTRL_CLOSE_EVENT
映射到 C 信号。可能 MinGW g++ 拥有它,因为它窃取了 Windows 的私有 C 运行时(msvcrt.dll)。我还没有彻底研究 POSIX 应用程序(Cygwin,MSYS)在从控制台(而不是终端仿真器)运行时如何实现这一点,但是当我关闭 MSYS bash 进程的控制台时,它会立即以@987654330 状态退出@ (0xC000013A),这表明默认控制处理程序被调用。以上是关于关闭 C++ 控制台应用程序时会发生啥的主要内容,如果未能解决你的问题,请参考以下文章