如何在Windows上运行的sqlite3.exe中停止长时间运行的SQL语句?
http://www.sqlite.org/cli.html处的文档说明了以下内容
您可以通过键入系统来终止sqlite3程序 文件结束字符(通常是Control-D)。使用中断 用于停止长时间运行的SQL语句的字符(通常是Control-C)。
但在Windows Control-D上什么都不做,Control-C终止了sqlite3程序。
我还尝试过Break(即Control-Pause),它和Control-C一样
有什么想法吗?
答案 0 :(得分:1)
它似乎只是Windows上的一个错误。
查看SQLite C source code as an amalgamation, version 3.8.8.3.中download page中的代码,我在shell.c
中看到SIGINT
有一个处理程序(对应于Control-C on如果定义了SIGINT
,则注册Windows:
#ifdef SIGINT
signal(SIGINT, interrupt_handler);
#endif
SIGINT
在signal.h
中定义,但在Windows上有意排除:
#if !defined(_WIN32) && !defined(WIN32)
# include <signal.h>
# if !defined(__RTP__) && !defined(_WRS_KERNEL)
# include <pwd.h>
# endif
# include <unistd.h>
# include <sys/types.h>
#endif
包括signal.h
导致信号处理程序被注册,并且我确实得到了一个中断(没有进程终止!)到一个长期运行的SQL命令与Control-C按预期。
这对后续的Control-C事件无法可靠地工作(例如,如果要在会话中中断第二个长时间运行的命令),并且signal(SIGINT,...)
对于MSDN上的Win32应用程序是documented as unsupported
使用特定于Windows的SetConsoleCtrlHandler
代替signal(SIGINT,...)
注册中断处理程序,可以为后续的Control-C事件可靠地工作。
以下是使用shell.c
提及的源版本SetConsoleCtrlHandler
的差异:
757c757
< #ifdef SIGINT
---
> #if defined(SIGINT) || defined(_WIN32) || defined(WIN32)
766a767,782
>
> #if defined(_WIN32) || defined(WIN32)
> /*
> ** Windows event handler
> */
> BOOL WINAPI CtrlHandler(DWORD dwType){
> switch( dwType ){
> case CTRL_C_EVENT:
> interrupt_handler(0);
> return TRUE;
>
> default:
> return FALSE;
> }
> }
> #endif
4207a4224,4225
> #elif defined(WIN32) || defined(_WIN32)
> SetConsoleCtrlHandler(CtrlHandler, TRUE);
通过将该合并中的所有源文件添加到Visual Studio C ++控制台项目(除了构建所需的标准/系统头之外没有外部依赖项),可以轻松构建shell。
我已向SQLite用户邮件列表发送了一条消息,通知他们该错误。