根据这个http://www.cplusplus.com/reference/clibrary/csignal/signal.html
SIGINT
通常由用户使用/引起。我如何SIGINT
在 c++ 中导致 a ?我看到了一个使用示例,kill(pid, SIGINT);
但我宁愿以另一种方式引起它。我也在使用窗户。
根据这个http://www.cplusplus.com/reference/clibrary/csignal/signal.html
SIGINT
通常由用户使用/引起。我如何SIGINT
在 c++ 中导致 a ?我看到了一个使用示例,kill(pid, SIGINT);
但我宁愿以另一种方式引起它。我也在使用窗户。
C89 和 C99 在 signal.h 中定义 raise():
#include <signal.h>
int raise(int sig);
该函数向调用进程发送信号,相当于
kill(getpid(), sig);
如果平台支持线程,那么调用就相当于
pthread_kill(pthread_self(), sig);
成功时返回值为 0,否则为非零。
SIGINT
您通过按引起 a Ctrl+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。我什至不确定kill()
在 Windows 上做了什么,因为 Windows 没有与 Unix 派生系统相同的信号架构。Win32 确实提供了 TerminateProcess 功能,它可以做你想做的事。还有GenerateConsoleCtrlEvent函数,它适用于控制台程序并模拟 Ctrl+C 或 Ctrl+Break。
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);
}
}
在这方面,“信号”是一个 Unix/POSIX 概念。Windows 没有直接的等价物。
我假设这是一个 Win32 应用程序...
对于“受控”或“安全”退出,如果应用程序使用消息循环,您可以在其内部使用 PostQuitMessage API,或在其外部使用 PostMessage。否则,您将需要获取线程/进程 ID 并使用 TerminateThread 或 TerminateProcess API,具体取决于您是想杀死一个线程还是整个进程以及它产生的所有线程。Microsoft(与所有 API 调用一样)在 MSDN 上很好地解释了它: