PROGRAMMATION SYSTEME 2: SIGNAUX
Transcription
PROGRAMMATION SYSTEME 2: SIGNAUX
PROGRAMMATION SYSTEME Léon Mugwaneza (email: [email protected]) 2: SIGNAUX 1 SIGNAUX • Notification logicielle émise par un processus ou par le noyau qui oblige le processus destinataire à prendre immédiatement (aux délais dus à l’ordonnancement près) une mesure spécifique (traiter le signal) • Un mécanisme de communication/synchronisation entre processus : − une primitive d’appel système permet à un processus d’envoyer un signal à un ou plusieurs processus (appel système kill) • Une commande permet à l’utilisateur d’envoyer un signal à un ou plusieurs processus (commande kill) • Les signaux émis par le noyau correspondent à des conditions logicielles ou matérielles particulières : – caractères de contrôle tapées au clavier (ex: CTR-C) – erreur dans le programme (violation de protection mémoire, erreur d’E/S, …) – terminaison d’un processus fils 2 – … TRAITEMENT DES SIGNAUX 3 façons différentes: – Les ignorer (eg. CRL- C pour les processus lancés en arrière plan) – Exécution du traitement par défaut – Exécution d’un traitement spécifiée par l’utilisateur 3 QUELQUES SIGNAUX POSIX ✏ Identifiés par le système par un nombre entier (numéro). - Les numéros associés aux signaux peuvent varier en fonctions des systèmes ✏ Quelques exemples (la commande shell kill –l donne les noms des divers signaux + les numéros sur certains systèmes) • • • • • • • • • • • SIGHUP SIGINT SIGQUIT SIGKILL seul) SIGUSR1 SIGUSR2 SIGPIPE SIGALRM alarm()) SIGTERM SIGCHLD etc… 1 2 3 9 déconnection du terminal interruption interactive par l’utilisateur (CTL-C) abandon CTL-| (core dump) destruction (ne peut être ignoré, traitement par défaut 10 12 13 14 réservé à l’utilisateur (communication inter-processus) réservé à l’utilisateur (communication inter-processus) essai d’écriture dans un pipe non ouvert en lecture Alarme (délai spécifié par le processus écoulé -- 15 terminaison normale d’un processus 17 mort d’un fils (envoyé au père) voir fichier /usr/include/asm/signal.h (dépend du SE) /usr/include/asm-i486/signal.h (SE debian) 4 Appel système pour envoyer un signal : kill • L’appel système kill() permet d’envoyer un signal à un ou +eurs processus #include<signal.h> int kill(int pid, int no_signal) ; – no_signal est le numéro du signal (les macros définies dans le fichier enête signal.h permettent d’utiliser un nom symbolique) – pid no du processus récepteur • si pid==0 tous les processus du groupe sont concernés • l’envoi de signal ne peut se faire qu’entre processus de même UID (appartenant au même utilisateur) – résultat • 0 si le signal a été envoyé • -1 sinon (erreur) – exemple : res = kill(0, SIGUSR1); 5 Traitement des signaux: signal (1) • L’appel système signal() permet de spécifier le comportement d’un processus à la réception d’un signal #include <signal.h> void (*signal (int sig, void (*fcn)(int)))(int) - sig : numéro du signal - (*fcn) : traitement à exécuter à la réception (on exécute fcn(sig), ou le traitement par défaut, ou le signal est ignoré) - retourne l’action précédente ou SIG_ERR Effet : installe (attache) fcn comme traitant du signal sig (fcn devient fonction attachée au signal sig, fcn peut être SIG_DFL ou SIG_IGN) 6 Traitement des signaux: signal (2) Prototype plus lisible en utilisant typedef #include <signal.h> typedef void (* sig_t) (int); sig_t signal(int sig, sig_t fcn); Exemples: sig_t res ; res= signal(SIGUSR1, traitant) ; res= signal(SIGINT, SIG_IGN); 7 Effet de la réception d’un signal (1) Dépend du traitement attaché au signal (SE ou appel système signal() ) •SIG_DFL ==> action par défaut – propre à chaque signal et prédéterminé par le SE – souvent terminaison du processus (abnormal termination) •SIG_IGN ==> pas d’action, le signal est ignoré – certains signaux ne peuvent pas être ignorés •Fonction attachée ==> action spécifiée par la fonction 8 Effet de la réception d’un signal (2) • A la réception du signal, si le signal n’est pas ignoré : – l’exécution cours est interrompu – la fonction attachée ou le traitement par défaut est exécuté – l’exécution du processus reprend son cours ☞le traitement par défaut peut conduire à la terminaison du processus 9 kill et signal : exemple #include <signal.h> #include <assert.h> int main(void) { int pid ; pid=fork(); assert(pid>=0); if(pid == 0) execv(" fils ", NULL); signal(SIGUSR1,fonc) ; for(;;) { printf(" je boucle\n "); sleep(1); } } void fonc(int sig) { printf(" signal recu %d\n ", sig); exit(0); } // l’exécutable s’appelera fils #include <signal.h> int main(void) { sleep(5); kill(getppid(),SIGUSR1); exit(0); } u a 1 et R S cle U G ou I S a b a) l a a l er n ig ter min s le rrê ter e i e a et o v èr c ( n e p on s l i Le a f f le re. ter 10 pè écu ex Appel système d’attente d’un signal : pause Syntaxe : #include <unistd.h> int pause(void); • Effet : – met le processus appelant en attente de l’arrivée d’un signal quelconque – après l’exécution du traitement attaché au signal reçu retourne -1 et errno = EINTR 11 Appel système d’émission d’un signal après un délai donné : alarm L’appel système alarm() envoi le signal SIGALRM au processus appelant après le laps de temps spécifié (en seconde) Syntaxe : #include<unistd.h> int alarm( int sec) ; Effet : - un appel à alarm() avant l’arrivée du signal d’un précédent appel à alarm() annule le précédent appel - resultat: - temps écoulé depuis le dernier appel - 0 si aucun appel alarm() en cours 12