我运行的控制台程序偶尔无法处理ctrl-c。示例是cygwin
程序,如果我在控制台而不是mintty
命令行音频工具中运行它们sox.exe
。
我通常输入,,Win-R然后启动一个程序。cmd
Enter
通常情况下,当你在 Windows 控制台中运行 Cygwin bash
shell 并按下 ctrl-c 时,它会处理它并重新打印其提示,但现在它已终止,并且我被提示Terminate batch job (Y/N)?
通常,sox.exe
响应 ctrl-c 时会打印“中止”消息,但现在它会崩溃并sox.exe has stopped working
显示标准 GUI 弹出窗口。
此外,如果我从文件启动某些程序.bat
,还会出现另一个弹出窗口:windows command processor has stopped working
重启后一切恢复正常。注销/登录或切换用户不起作用。
下面的简单程序在我的计算机上也崩溃了,但是相同的二进制文件在另一台计算机上却运行成功:
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <conio.h>
static BOOL WINAPI MyHandlerRoutine(
_In_ DWORD dwCtrlType
) {
switch (dwCtrlType) {
case CTRL_C_EVENT:
printf("ctrl-c pressed\n");
return TRUE;
case CTRL_BREAK_EVENT:
printf("ctrl-break pressed\n");
return TRUE;
}
return FALSE;
}
int main()
{
int c;
DWORD dw = 0;
BOOL b;
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
b = GetConsoleMode(hStdin, &dw);
printf("GetConsoleMode() returned %d %u\n", (int)b, dw);
dw = dw & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
dw = ENABLE_PROCESSED_INPUT;
SetLastError(0);
b = SetConsoleMode(hStdin, dw);
printf("SetConsoleMode(%u) returned %d\n", dw, (int)b);
if (!b) {
printf("GetLastError() returned %u\n", GetLastError());
}
b = SetConsoleCtrlHandler(MyHandlerRoutine, TRUE);
printf("SetConsoleCtrlHandler() returned %d\n", (int)b);
printf("press ENTER to exit\n");
for (;;) {
char buf[1];
c = getchar();
printf("%02x ", c);
// EOF == c ||
if (10 == c || 13 == c) break;
}
return 0;
}