如何在 C++ 中引发 SIGINT?

问题描述 投票:0回答:6

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

SIGINT
通常由用户使用/引起。如何在 C++ 中产生
SIGINT
?我看到了一个使用
kill(pid, SIGINT);
的例子,但我宁愿用另一种方式造成它。我也在使用Windows。

c++ windows signals sigint
6个回答
9
投票

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

#include <signal.h>

int raise(int sig);

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

kill(getpid(), sig);

如果平台支持线程,那么调用相当于

pthread_kill(pthread_self(), sig);

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


7
投票

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)
正如你所说...


1
投票

您还想什么其他办法?

kill()
函数是内核提供以编程方式发送信号的唯一方法。

实际上,您提到您正在使用 Windows。我什至不确定

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


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

0
投票

“信号”在这方面是一个 Unix/POSIX 概念。 Windows 没有直接的等效项。


0
投票

我假设这是一个 Win32 应用程序...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.