关闭C++控制台应用程序会发生什么?

25

我想这个问题已经说得很清楚了,但是,如果有人关闭了一个C++控制台应用程序,会发生什么?比如点击右上角的“x”按钮。它会立即关闭吗?会抛出某种异常吗?还是未定义的行为?


2
你对哪个平台感兴趣?Windows?Linux?这会直接影响答案。 - Rob K
使用“控制台应用程序”这个短语意味着Windows,因为这是MS术语的字符模式应用程序。 - AndrewR
4个回答

21

当你点击C++控制台应用程序窗口右上角的“x”关闭按钮时,会抛出一个CTRL_CLOSE_EVENT事件。如果使用SetConsoleCtrlHandler函数设置一个控制处理函数,你就可以捕获并处理这个事件。在控制处理函数中,你可以重写关闭功能并执行任何你想做的操作,然后选择性地执行默认行为。


无法覆盖关闭控制台。无论您返回 TRUE 还是 FALSE,进程都会退出。如果您延迟返回,例如进行清理,则默认情况下在杀死进程之前会给您5秒钟的时间。即使您手动调用了 AllocConsoleAttachConsole,也是一样的,并且在处理程序中调用 FreeConsole 已经太晚了。如果用户关闭控制台不应该终止主进程,则需要使用子进程来控制台,并使用管道连接标准 I/O。 - Eryk Sun

9

9
在Linux和其他Unix系统中,控制台作为一个独立的进程运行。当你关闭shell时,它会向当前活动的进程或未在后台执行的进程发送SIGHUP信号。如果程序员没有处理它,进程将简单地终止。如果你使用终端关闭SSH会话并且有活动进程,也会发送相同的信号。

8

SIGBREAK 是 Windows 上的一个信号。


1
这并没有提供问题的答案。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言。 - DLeh
3
当然可以。这就是我在找到这个页面时想要的答案。 - user472308
只有在使用C运行时才会引发SIGBREAK。Windows本身没有Unix信号。 C运行时具有控制台控制处理程序,将CTRL_C_EVENT映射到SIGINT,并将所有其他控制事件映射到SIGBREAK - Eryk Sun
@eryksun说得很好。但是如果您确实正在使用C运行时,则使用https://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm处理“SIGBREAK”是处理手动窗口关闭的一种清洁方式。 - DrMcCleod
@DrMcCleod,如果我们使用其他的C/C++实现,它们可能不会实现SIGBREAK(它不是标准C),或者将CTRL_CLOSE_EVENT映射到C信号。可能MinGW g++有它,因为它窃取了Windows的私有C运行时(msvcrt.dll)。我还没有彻底调查过POSIX应用程序(Cygwin、MSYS)在从控制台运行时(而不是终端仿真器)如何实现这一点,但当我关闭一个MSYS bash进程的控制台时,它立即以状态STATUS_CONTROL_C_EXIT(0xC000013A)退出,这表明默认的控制处理程序被调用了。 - Eryk Sun

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