题
根据该 http://www.cplusplus.com/reference/ clibrary / csignal / signal.html
SIGINT
通常由用户使用/原因。我怎么会在C ++ SIGINT
?我使用kill(pid, SIGINT);
看到一个例子,但我宁愿导致它的另一种方式。还我使用的窗口。
解决方案
C89和C99定义signal.h中加注():
#include <signal.h>
int raise(int sig);
此功能将信号发送到调用进程,并且等同于
kill(getpid(), sig);
如果该平台支持线程,则该呼叫相当于
pthread_kill(pthread_self(), sig);
,返回值是0表示成功,否则非零。
其他提示
您会导致SIGINT
按控制+ C
实施例的代码:
#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。我甚至不能肯定不会在Windows什么kill()
,因为Windows不具有相同的信号架构的Unix派生系统做的。 Win32的确实提供TerminateProcess函数,它可以做你想做的。此外还有 GenerateConsoleCtrlEvent 功能,它适用到控制台的程序和模拟Ctrl + C或CTRL + BREAK。
“信号”在这方面是在Unix / POSIX概念。视窗没有直接等同物。
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);
}
}
我假设这是一个Win32应用程序...
有关一“控制”或“安全”退出,如果应用使用了可以使用PostQuitMessage API从内部的,或PostMessage的外面它一个消息循环。否则,你将需要获得线程/进程ID和则使用TerminateThread或API了TerminateProcess,取决于如果你想杀死只是一个线程或整个过程,它催生了所有的线程上。它是很好的微软MSDN上解释(与所有API调用):