我想这个问题已经说得很清楚了,但是,如果有人关闭了一个C++控制台应用程序,会发生什么?比如点击右上角的“x”按钮。它会立即关闭吗?会抛出某种异常吗?还是未定义的行为?
我想这个问题已经说得很清楚了,但是,如果有人关闭了一个C++控制台应用程序,会发生什么?比如点击右上角的“x”按钮。它会立即关闭吗?会抛出某种异常吗?还是未定义的行为?
当你点击C++控制台应用程序窗口右上角的“x”关闭按钮时,会抛出一个CTRL_CLOSE_EVENT
事件。如果使用SetConsoleCtrlHandler函数设置一个控制处理函数,你就可以捕获并处理这个事件。在控制处理函数中,你可以重写关闭功能并执行任何你想做的操作,然后选择性地执行默认行为。
TRUE
还是 FALSE
,进程都会退出。如果您延迟返回,例如进行清理,则默认情况下在杀死进程之前会给您5秒钟的时间。即使您手动调用了 AllocConsole
或 AttachConsole
,也是一样的,并且在处理程序中调用 FreeConsole
已经太晚了。如果用户关闭控制台不应该终止主进程,则需要使用子进程来控制台,并使用管道连接标准 I/O。 - Eryk SunSIGBREAK
是 Windows 上的一个信号。
SIGBREAK
。Windows本身没有Unix信号。 C运行时具有控制台控制处理程序,将CTRL_C_EVENT
映射到SIGINT
,并将所有其他控制事件映射到SIGBREAK
。 - Eryk SunSIGBREAK
(它不是标准C),或者将CTRL_CLOSE_EVENT
映射到C信号。可能MinGW g++有它,因为它窃取了Windows的私有C运行时(msvcrt.dll)。我还没有彻底调查过POSIX应用程序(Cygwin、MSYS)在从控制台运行时(而不是终端仿真器)如何实现这一点,但当我关闭一个MSYS bash进程的控制台时,它立即以状态STATUS_CONTROL_C_EXIT
(0xC000013A)退出,这表明默认的控制处理程序被调用了。 - Eryk Sun