好的,我正在写一个正在做一些相当繁重的分析的程序,我希望能够很快的停下来。
我加了signal(SIGINT, terminate);
到主要和定义终止的开始,如:
void terminate(int param){ cout << endl << endl << "Exit [N]ow, or [A]fter this url?" << endl; std::string answer; cin >> answer; if(answer[0] == 'n' || answer[0] == 'N'){ terminateParser(); exit(1); }else if(answer[0] == 'a' || answer[0] == 'A'){ quitAfterUrl = true; } }
在Linux中,这个工作正如我所期望的那样,那就是等待用户input。 但是,当我试图在Windows中做同样的事情,它显示消息并退出。
有什么办法可以阻止SIGINT立即closures程序?
更新:
当我尝试
BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; }
正如格雷戈里所build议的那样,该程序仍然毫不客气地退出,而不会停止用户input。
更新2:我不完全确定它是什么,但代码现在工作。 谢谢大家的帮助。
来自MSDN:
注意 SIGINT不支持任何Win32应用程序,包括Windows 98 / Me和Windows NT / 2000 / XP。 当发生CTRL + C中断时,Win32操作系统会生成一个新线程来专门处理该中断。 这可能会导致单线程应用程序(如UNIX)变成多线程,从而导致意外的行为。
这意味着您将不得不使用预处理指令并实施Windows特定的解决方案 。
BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; }
在main
的开始你做
SetConsoleCtrlHandler(handler, TRUE);