zmb*_*ush 3 c++ windows signals copy-paste sigint
好的,我正在编写一个程序正在进行一些非常繁重的分析,我希望能够快速停止它.
我添加signal(SIGINT, terminate);到main的开头并定义了终止,如:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在linux中,这正如我所期望的那样,即它等待用户输入.但是,当我尝试在Windows中执行相同操作时,它会显示消息并退出.
有没有办法阻止SIGINT立即关闭程序?
更新:
当我试着
BOOL WINAPI handler(DWORD dwCtrlType)
{
if (CTRL_C_EVENT == dwCtrlType)
{
// ask the user
}
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
正如Gregory建议的那样,该程序仍然毫不客气地退出而没有停止用户输入.
更新2:我不确定它做了什么,但代码现在正在运行.谢谢大家的帮助.
注意 任何Win32应用程序都不支持SIGINT,包括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;
}
Run Code Online (Sandbox Code Playgroud)
而在main你做的开始
SetConsoleCtrlHandler(handler, TRUE);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |