使用SIGINT

时间:2009-01-27 08:56:54

标签: c++ windows signals

根据此http://www.cplusplus.com/reference/clibrary/csignal/signal.html

SIGINT通常由用户使用/导致。我如何在c ++中导致SIGINT?我看到了一个使用kill(pid, SIGINT);的例子,但我更倾向于另一种方式。我也在使用Windows。

6 个答案:

答案 0 :(得分:7)

C89和C99在signal.h中定义raise():

#include <signal.h>

int raise(int sig);

此函数向调用进程发送信号,相当于

kill(getpid(), sig);

如果平台支持线程,则该调用等同于

pthread_kill(pthread_self(), sig);

成功时返回值为0,否则返回非零值。

答案 1 :(得分:5)

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 ++中工作)

编辑:除了交互式按 Ctrl + C 之外,我知道发送SIGINT的唯一方法是使用kill(pid, SIGINT),如你所说...

答案 2 :(得分:1)

您还有其他想法吗? kill()函数是内核以编程方式发送信号的唯一方式。

实际上,您提到过您使用的是Windows。我甚至不确定kill()在Windows上的作用,因为Windows没有与Unix衍生系统相同的信号架构。 Win32确实提供了TerminateProcess功能,它可以做你想要的。还有GenerateConsoleCtrlEvent函数,它适用于控制台程序并模拟Ctrl + C或Ctrl + Break。

答案 3 :(得分:1)

这方面的“信号”是Unix / POSIX概念。 Windows没有直接的等价物。

答案 4 :(得分:1)

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);
    }
}

答案 5 :(得分:0)

我认为这是一个Win32应用程序......

对于“受控”或“安全”退出,如果应用程序使用消息循环,您可以从其内部使用PostQuitMessage API,或在其外部使用PostMessage。否则,您将需要获取线程/进程ID并使用TerminateThread或TerminateProcess API,具体取决于您是要仅删除线程还是整个进程以及它已生成的所有线程。 MSDN很好地解释了它(与所有API调用一样):

http://msdn.microsoft.com/en-us/library/aa450927.aspx