Question

Selon cette http://www.cplusplus.com/reference/ clibrary / csignal / signal.html

SIGINT est généralement utilisé / cause par l'utilisateur. Comment provoquer un kill(pid, SIGINT); en c ++? J'ai vu un exemple utilisant <=> mais je le cause plutôt d'une autre manière. J'utilise aussi Windows.

Était-ce utile?

La solution

C89 et C99 définissent raise () dans signal.h:

#include <signal.h>

int raise(int sig);

Cette fonction envoie un signal au processus appelant et équivaut à

.
kill(getpid(), sig);

Si la plate-forme prend en charge les threads, l'appel est équivalent à

.
pthread_kill(pthread_self(), sig);

La valeur de retour est 0 en cas de succès, sinon zéro.

Autres conseils

Vous provoquez un SIGINT en appuyant sur Ctrl + C .

Exemple de code:

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

À l'exécution:

$ ./a.out 
^CUser pressed Ctrl+C
$ 

(Notez que ceci est du code C pur, devrait fonctionner en C ++ cependant)

Modifier: le seul moyen que je connaisse pour envoyer kill(pid, SIGINT) en dehors de l'appui interactif sur Ctrl + C consiste à utiliser <=> comme vous l'avez dit ...

De quelle autre manière envisagez-vous? La fonction kill() est le seul moyen proposé par le noyau pour envoyer un signal par programmation.

En fait, vous avez mentionné que vous utilisiez Windows. Je ne sais même pas ce que <=> fait Windows, car Windows n’a pas la même architecture de signal que les systèmes dérivés de Unix. Win32 offre la fonction TerminateProcess, qui peut faire ce que vous voulez. Il existe également la fonction GenerateConsoleCtrlEvent , qui s'applique pour console et simule un Ctrl + C ou Ctrl + Break.

" Signaux " à cet égard sont un concept Unix / POSIX. Windows n'a pas d'équivalent direct.

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

Je suppose que c'est une application Win32 ...

Pour un "ient contrôlé " ou " safe " exit, si l'application utilise une boucle de message, vous pouvez utiliser l'API PostQuitMessage de l'intérieur ou PostMessage à l'extérieur. Sinon, vous devrez obtenir l'ID de thread / processus et utiliser l'API TerminateThread ou TerminateProcess, selon que vous souhaitez tuer uniquement un thread ou l'ensemble du processus et tous les threads générés. Comme Microsoft (comme pour tous les appels d’API) explique MSDN de manière explicite:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top