Использование SIGINT - PullRequest
2 голосов
/ 27 января 2009

Согласно этому http://www.cplusplus.com/reference/clibrary/csignal/signal.html

SIGINT обычно используется / вызывается пользователем. Как я могу вызвать SIGINT в C ++? Я видел пример, использующий kill(pid, SIGINT);, но я скорее вызываю это другим способом. Также я использую Windows.

Ответы [ 6 ]

7 голосов
/ 27 января 2009

C89 и C99 определяют повышение () в signal.h:

#include <signal.h>

int raise(int sig);

Эта функция отправляет сигнал вызывающему процессу и эквивалентна

kill(getpid(), sig);

Если платформа поддерживает потоки, то вызов эквивалентен

pthread_kill(pthread_self(), sig);

В случае успеха возвращается 0, в противном случае - ненулевое значение.

5 голосов
/ 27 января 2009

Вы вызываете SIGINT нажатием 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), как вы сказали ...

1 голос
/ 25 апреля 2017
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);
    }
}
1 голос
/ 27 января 2009

«Сигналы» в этом отношении являются концепцией Unix / POSIX. Windows не имеет прямого эквивалента.

1 голос
/ 27 января 2009

О каком другом пути вы думаете? Функция kill() - единственный способ, которым ядро ​​предлагает программно отправить сигнал.

На самом деле вы упомянули, что используете Windows. Я даже не уверен, что kill() делает в Windows, поскольку Windows не имеет той же архитектуры сигналов, что и системы на основе Unix. Win32 действительно предлагает функцию TerminateProcess, которая может делать то, что вы хотите. Существует также функция GenerateConsoleCtrlEvent , которая применяется к консольным программам и имитирует Ctrl + C или Ctrl + Break.

0 голосов
/ 27 января 2009

Я предполагаю, что это приложение Win32 ...

Для «контролируемого» или «безопасного» выхода, если приложение использует цикл обработки сообщений, вы можете использовать PostQuitMessage API изнутри или PostMessage вне его. В противном случае вам нужно будет получить идентификатор потока / процесса и использовать API-интерфейс TerminateThread или TerminateProcess, в зависимости от того, хотите ли вы удалить только поток или весь процесс и все потоки, которые он породил. Это хорошо объясняется Microsoft (как и все вызовы API) на MSDN:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...