2009-01-27 3 views

Répondre

7

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

#include <signal.h> 

int raise(int sig); 

Cette fonction envoie un signal au processus d'appel, et est équivalent à

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, non nul autre.

1

De quel autre moyen pensez-vous? La fonction kill() est le seul moyen que le noyau offre pour envoyer un signal par programmation.

En fait, vous avez mentionné que vous utilisiez Windows. Je ne suis même pas sûr de ce que fait kill() sur Windows, puisque Windows n'a pas la même architecture de signal que les systèmes dérivés d'Unix. Win32 offre la fonction TerminateProcess, qui peut faire ce que vous voulez. Il y a aussi la fonction GenerateConsoleCtrlEvent, qui s'applique aux programmes de la console et simule un Ctrl + C ou Ctrl + Break.

1

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

5

vous faire une SIGINT en appuyant sur les touches Ctrl + C .

code Exemple:

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

Exécuté:

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

(Notez que ce code est en pur C, devrait fonctionner en C++ bien)

Edit: La seule façon que je connaisse d'envoyer SIGINT en dehors de interactivement en appuyant sur Ctrl + C utilise kill(pid, SIGINT) comme vous l'avez dit ...

+1

petit reproche, vous ne devriez pas appellerez soit « printf » ou « sortie » dans le corps du gestionnaire de signaux : http: // stackoverflow.com/questions/103280/portable-façon-pour-attraper-signaux-et-rapport-problème-à-l'utilisateur –

0

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

Pour une sortie « contrôlée » ou « sûr », si l'application utilise une boucle de message, vous pouvez utiliser l'API PostQuitMessage à l'intérieur de celui-ci, ou PostMessage extérieur de cela. Sinon, vous devrez obtenir l'ID de processus/thread et utiliser l'API TerminateThread ou TerminateProcess, selon que vous voulez supprimer uniquement un thread ou le processus entier et tous les threads qu'il a générés. Il est expliqué bien par Microsoft (comme tous les appels API) sur MSDN:

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

0
 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

S'il vous plaît ne pas ajouter la [même réponse à plusieurs questions] (http: //meta.stackexchange. com/questions/104227/est-il-acceptable-à-ad ?? da-dupliquer-répondre-à-plusieurs-questions). Répondez le meilleur et marquez le reste comme doublons, une fois que vous gagnez assez de réputation. Si ce n'est pas un doublon, adaptez le message à la question –