Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows控制台应用程序-关闭事件的信号_C_Signals_Console Application_Windows Console - Fatal编程技术网

C Windows控制台应用程序-关闭事件的信号

C Windows控制台应用程序-关闭事件的信号,c,signals,console-application,windows-console,C,Signals,Console Application,Windows Console,在windows控制台应用程序中,您可以通过使用以下命令捕捉按下ctrl+c: #包括 #包括 无效信号处理器(int n_信号) { printf(“中断\n”); } int main(int n_arg_num,常量字符**p_arg_列表) { 信号(SIGINT和SIGINT_处理器); getchar();//等待用户干预 } 这很有效,但如果用户按下关闭控制台窗口的叉键,则根本不起作用。有信号吗 我之所以需要它,是因为我有一个CUDA应用程序,如果在计算某些东西时关闭,它会导致计

在windows控制台应用程序中,您可以通过使用以下命令捕捉按下
ctrl+c

#包括
#包括
无效信号处理器(int n_信号)
{
printf(“中断\n”);
}
int main(int n_arg_num,常量字符**p_arg_列表)
{
信号(SIGINT和SIGINT_处理器);
getchar();//等待用户干预
}
这很有效,但如果用户按下关闭控制台窗口的叉键,则根本不起作用。有信号吗


我之所以需要它,是因为我有一个CUDA应用程序,如果在计算某些东西时关闭,它会导致计算机崩溃。代码是多平台的,所以我更喜欢使用信号,而不是
SetConsoleCtrlHandler
。有办法吗?

正确的方法是
SIGBREAK
,您可以尝试以下方法:

#包括
#包括
无效信号处理器(int n_信号)
{
printf(“中断\n”);
出口(1);
}
无效信号中断处理器(int n_信号)
{
printf(“已关闭”);
出口(2);
}
int main(int n_arg_num,常量字符**p_arg_列表)
{
信号(SIGINT和SIGINT_处理器);
信号(SIGBREK和SIGBREK_处理器);
getchar();//等待用户干预
返回0;
}

关闭控制台窗口后,程序将打印
“closed”
,并返回2。

但您不能在此时中止退出,不是吗?现在似乎有一种方法可以防止控制台在处理程序内部退出。我想你可以永远等下去,这时会弹出一个“强制关闭”对话框。但由于没有返回值,我想您不能中止。我只是想找到一种方法来延迟退出并正确关闭应用程序。@theswine,在Vista中,后来就没有对话框了。如果控件处理程序返回
TRUE
或返回时间超过5秒,Windows(csrss.exe)将强制终止进程。如果处理程序返回
FALSE
,则默认处理程序调用
ExitProcess
。在这些情况下,进程退出代码是
状态控制\u C\u退出
(0xC000013A)。在Windows 10中,这不再起作用,永远不会调用安装了
SIGBREAK
的信号处理程序,应用程序会立即退出。@Youda008,否,在Windows 10中,即使在Windows终端下,也会为
CTRL\u BREAK\u事件
CTRL\u CLOSE\u事件
调用
SIGBREAK
处理程序。只有控制台的
CTRL\u LOGOFF\u事件
CTRL\u SHUTDOWN\u事件
有点不稳定。对于一个简单的控制台应用程序,它们被发送并映射到
SIGBREAK
。但是,如果进程加载user32.dll(即,如果进程连接到窗口站和桌面),则不会发送这些文件。预计连接到桌面会话的应用程序将创建一个窗口并处理
WM\u QUERYENDSESSION
WM\u ENDSESSION