如何停止在Windows上运行的sqlite3.exe中长时间运行的SQL语句?
http://www.sqlite.org/cli.html上的文档声明如下
您可以通过键入您的系统文件结束符(通常是Control-D)来终止sqlite3程序。 使用中断字符(通常是Control-C)来停止长时间运行的SQL语句。
但在Windows上,Control-D什么也不做,Control-C终止sqlite3程序。
我也试过Break(即Control-Pause),它和Control-C一样
有任何想法吗?
它似乎只是在Windows上的错误。
将C源代码中的代码视为合并版本3.8.8.3。 从SQLite 下载页面 ,我发现在shell.c
,如果定义了SIGINT
,就会有一个SIGINT
处理程序(对应于Windows上的Control-C)注册:
#ifdef SIGINT signal(SIGINT, interrupt_handler); #endif
SIGINT
是在signal.h
中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
会导致信号处理程序被注册,并且如预期的那样,使用Control-C将长时间运行的SQL命令中断(没有进程终止!)。
尽管(例如,如果要中断会话中的第二个长时间运行的命令),并且signal(SIGINT,...)
被记录为不支持 MSDN上的Win32应用程序,但这对于后续的Control-C事件并不可靠。
使用特定于Windows的SetConsoleCtrlHandler
而不是signal(SIGINT,...)
来注册中断处理程序可以可靠地用于后续的Control-C事件。
以下是使用SetConsoleCtrlHandler
提到的源代码版本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用户邮件列表来通知他们错误。