GNU/Linux >> Tutoriels Linux >  >> Linux

Ctrl + C gestion des événements d'interruption sous Linux

Lorsque vous appuyez sur Ctr + C , le système d'exploitation envoie un signal au processus. Il existe de nombreux signaux et l'un d'eux est SIGINT. Le SIGINT ("interruption de programme") est l'un des signaux de terminaison.

Il existe quelques autres types de signaux de terminaison, mais la chose intéressante à propos de SIGINT est qu'il peut être géré (intercepté) par votre programme. L'action par défaut de SIGINT est la fin du programme. Autrement dit, si votre programme ne gère pas spécifiquement ce signal, lorsque vous appuyez sur Ctr + C votre programme se termine comme action par défaut.

Pour changer l'action par défaut d'un signal, vous devez enregistrer le signal à attraper. Pour enregistrer un signal dans un programme C (au moins sous les systèmes POSIX) il y a deux fonctions

  1. signal(int signum, sighandler_t handler);
  2. sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);.

Ces fonctions nécessitent que l'en-tête signal.h soit inclus dans votre code C. J'ai fourni un exemple simple du signal fonction ci-dessous avec des commentaires.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
  flag = 1; // set flag
}

int main(){
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag){ // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
    }     
  return 0;
}  

Remarque :vous ne devez appeler que des fonctions sécurisées/autorisées dans le gestionnaire de signaux. Par exemple, évitez d'appeler printf dans le gestionnaire de signaux.

Vous pouvez compiler ce code avec gcc et l'exécuter depuis le shell. Il y a une boucle infinie dans le code et elle fonctionnera jusqu'à ce que vous envoyiez un SIGINT signal en appuyant sur Ctr + C .


Vous pouvez utiliser la macro de signal.

Voici un exemple de la façon de le gérer :

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}

Exemple de sortie :

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught

Taper Ctrl C provoque normalement l'envoi de SIGINT par le shell à votre programme. Ajoutez un gestionnaire pour ce signal (via signal(2) ou sigaction(2) ), et vous pouvez faire ce que vous voulez quand Ctrl C est enfoncé.

Alternativement, si vous ne vous souciez que du nettoyage avant la sortie de votre programme, configurez un gestionnaire de sortie via atexit(3) pourrait être plus approprié.


Linux
  1. Liste des signaux générés par le terminal (par exemple, Ctrl-c -> Sigint) ?

  2. Signaux Linux - Exemple de programme C pour capturer des signaux (SIGINT, SIGKILL, SIGSTOP, etc.)

  3. Fondamentaux des signaux Linux - Partie I

  4. Équivalent de ctrl c dans la commande pour annuler un programme

  5. Définir un point d'arrêt dans le code C ou C++ par programmation pour gdb sous Linux

Installez un signal alternatif WhatsApp respectueux de la vie privée sur le bureau Linux

IPC utilisant des signaux sur Linux

Force du signal Bluetooth LE Linux

Qu'est-ce qu'un processus arrêté sous Linux ?

Comment une interruption est-elle gérée sous Linux ?

Raccourci clavier du gestionnaire de tâches sous Linux?