Traductions de cette page?:

signal

Syntaxe :

    #include <csignal>
    void ( *signal( int signal, void (* func) (int)) ) (int);

La fonction signal() connecte le signal à la fonction func lorsqu'il est reçu par votre programme. func peut être une fonction de gestion du signal personnalisée ou l'une des macros suivantes (définies dans le header csignal) :

MacroDescription
SIG_DFLgestionnaire de signal par defaut
SIG_IGNle signal est ignoré

Voici quelques exemple de signaux auxquels vous pouvez connecter une fonction de gestion personnalisée :

SignalDescription
SIGTERMSignal de terminaison qui peut être intercepté par une fonction personnalisée
SIGINTSignal d'interruption du programme, en général ctrl-c
SIGKILLArrête l'exécution du programme. Ce signal ne peut être intercepté par une fonction personnalisée
SIGHUPFin de session (terminal déconnecté)
SIGSEGVErreur de segmentation

La valeur de retour de signal() est l'adresse de la fonction définie avant l'appel à signal() pour ce signal, ou SIG_ERR s'il y a eu une erreur.

L'exemple ci-dessous utilise la fonction signal() pour appeler un nombre de fonction arbitraire lorsque l'utilisateur interrompt l'exécution du programme. Les fonctions sont répertoriées dans un vector et une simple fonction de “nettoyage” appelle chaque fonction dans ce vector de fonctions lorsque le programme est interrompu.

  void f1() {
    cout << "appel de f1()..." << endl;
  }
 
  void f2() {
    cout << "appel de f2()..." << endl;
  }
 
  typedef void(*endFunc)(void);
  vector<endFunc> endFuncs;
 
  void nettoyage( int foo) {
    for( unsigned int i = 0; i < endFuncs.size(); i++ ) {
      endFunc f = endFuncs.at(i);
      (*f)();
    }
    exit(-1);
  }
 
  int main() {
 
    // connexion de divers signaux à notre fonction de nettoyage
    signal( SIGTERM, nettoyage);
    signal( SIGINT, nettoyage);
    signal( SIGQUIT, nettoyage);
    signal( SIGHUP, nettoyage);
 
    // ajout des fonctions de nettoyages particulière à la liste des fonctions
    endFuncs.push_back( f1 );
    endFuncs.push_back( f2 );
 
    // boucle infinie jusqu'à ce que l'utilisateur interrompe le programme
    while( 1 );
 
    return 0;
  }

Sujet connexe : raise