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) :
| Macro | Description |
|---|---|
| SIG_DFL | gestionnaire de signal par defaut |
| SIG_IGN | le signal est ignoré |
Voici quelques exemple de signaux auxquels vous pouvez connecter une fonction de gestion personnalisée :
| Signal | Description |
|---|---|
| SIGTERM | Signal de terminaison qui peut être intercepté par une fonction personnalisée |
| SIGINT | Signal d'interruption du programme, en général ctrl-c |
| SIGKILL | Arrête l'exécution du programme. Ce signal ne peut être intercepté par une fonction personnalisée |
| SIGHUP | Fin de session (terminal déconnecté) |
| SIGSEGV | Erreur 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