根据该 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调用):

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top