根据这个http://www.cplusplus.com/reference/clibrary/csignal/signal.html
SIGINT
通常由用户使用/导致。 我如何在c ++中导致SIGINT
? 我看到一个例子使用kill(pid, SIGINT);
但我宁愿另一种方式。 另外我正在使用Windows。
C89和C99在signal.h中定义了raise():
#include <signal.h> int raise(int sig);
这个函数发送一个信号给调用进程,相当于
kill(getpid(), sig);
如果平台支持线程,那么调用相当于
pthread_kill(pthread_self(), sig);
成功返回值为0,否则返回非零值。
按Ctrl + C导致SIGINT
。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <signal.h> void siginthandler(int param) { printf("User pressed Ctrl+C\n"); exit(1); } int main() { signal(SIGINT, siginthandler); while(1); return 0; }
运行时:
$ ./a.out ^CUser pressed Ctrl+C $
(请注意,这是纯粹的C代码,但应该在C ++中工作)
编辑:我知道发送SIGINT
的唯一方法除了交互式按Ctrl + C是使用kill(pid, SIGINT)
正如你所说…
你还有什么其他的想法? kill()
函数是内核以编程方式发送信号的唯一方式。
其实,你提到你使用的是Windows。 我什至不知道什么kill()
在Windows上,因为Windows没有相同的信号架构,Unix派生的系统。 Win32确实提供了TerminateProcess函数,它可以做你想做的事情。 还有GenerateConsoleCtrlEvent函数,该函数适用于控制台程序并模拟Ctrl + C或Ctrl + Break。
这方面的“信号”是Unix / POSIX的概念。 Windows没有直接的等价物。
我认为这是一个Win32应用程序…
对于“受控”或“安全”退出,如果应用程序使用消息循环,则可以在其内部使用PostQuitMessage API,或者在其之外使用PostMessage API。 否则,您将需要获取线程/进程ID,并使用TerminateThread或TerminateProcess API,具体取决于是否只想杀死一个线程或整个进程以及它所产生的所有线程。 Microsoft(如同所有API调用一样)在MSDN上很好地解释了这一点:
void SendSIGINT( HANDLE hProcess ) { DWORD pid = GetProcessId(hProcess); FreeConsole(); if (AttachConsole(pid)) { // Disable Ctrl-C handling for our program SetConsoleCtrlHandler(NULL, true); GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // SIGINT //Re-enable Ctrl-C handling or any subsequently started //programs will inherit the disabled state. SetConsoleCtrlHandler(NULL, false); WaitForSingleObject(hProcess, 10000); } }