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