Signaux Il s'agit de messages asynchrones envoyés à un processus soit par le système soit par d'autres processus La liste des signaux peut être obtenue par la commande "kill -l" : $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+1 34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5 38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9 42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1 63) SIGRTMAX signaux
traitement des signaux lorsqu'un processus reçoit un signal, il exécute le traitant correspondant (traitant=handler) le comportement "par défaut" dépend du signal: soit ignoré soit terminaison du processus soit terminaison du processus avec création d'un fichier "image mémoire" (core) signaux
Les principaux signaux SIGHUP | 1 | A | Raccrochement (déconnexion) sur terminal de | | | contrôle, ou mort du processus de contrôle. SIGINT | 2 | A | Interruption depuis le clavier (CTRL C) SIGQUIT | 3 | A | Demande 'Quitter' depuis le clavier (CTRL \) SIGILL | 4 | A | Instruction illégale. SIGABRT | 6 | C | Signal d'arrêt depuis abort(3). SIGFPE | 8 | C | Erreur mathématique virgule flottante. SIGKILL | 9 | AEF | Signal 'KILL'. SIGSEGV | 11 | C | Référence mémoire invalide. SIGALRM | 14 | A | Temporisation alarm(2) écoulée. SIGTERM | 15 | A | Signal de fin. SIGUSR1 | 30,10,16 | A | Signal utilisateur 1. SIGUSR2 | 31,12,17 | A | Signal utilisateur 2. SIGCHLD | 20,17,18 | B | Fils arrêté ou terminé. SIGCONT | 19,18,25 | | Continuer si arrêté (commandes bg ou fg) SIGSTOP | 17,19,23 | DEF | Arrêt du processus (CTRL z) A : mort du processus B : signal ignoré C : mort du processus + core D : arrêter le processus E : Le signal ne peut pas être intercepté. F : Le signal ne peut pas être ignoré. signaux
interface de programmation L'appel système signal(SIG_NUM, handler) permet de modifier la gestion du signal SIG_NUM : handler peut être : SIG_IGN : le signal sera ignoré SIG_DFL : traitement par défaut l'adresse d'une fonction fournie par le programme : cette fonction sera appelée quand le signal sera reçu l'appel à signal() retourne l'adresse de la fonction de traitement courante, pour pouvoir la restaurer plus tard. signaux
Interface de programmation l'appel système kill(PID, SIG_NUM) permet d'envoyer le signal SIG_NUM au processus de PID PID. La fonction raise(SIG_NUM) permet à un processus de s'envoyer le signal SIG_NUM. la fonction alarm(sec) demande au système d'envoyer un signal SIG_ALRM au processus appelant après sec secondes. Si sec = 0, toute alarme demandée précédemment est annulée la fonction pause() met le processus courant à l'état "endormi" en attente de signaux. Quand un signal est reçu, il est traité, puis l'exécution reprend en sortie de la fonction pause(). signaux
signaux : exemple 1 #include<stdio.h> #include<signal.h> void hand() { printf("Envoyer le signal SIGKILL pour me tuer\n"); } main() printf("mon PID est %d\n",getpid()); signal(SIGINT,hand); signal(SIGQUIT,hand); for(;;); signaux
Résultat : exemple 1 [couveep@pegtst2 os]$ ./signal1 & [1] 12970 mon PID est 12970 [couveep@pegtst2 os]$ kill -SIGINT 12970 Envoyer le signal SIGKILL pour me tuer [couveep@pegtst2 os]$ kill -SIGQUIT 12970 [couveep@pegtst2 os]$ [couveep@pegtst2 os]$ kill -SIGTERM 12970 [1]+ Terminated ./signal1 signaux
signaux : exemple 2 programme de surveillance de la température interne du système, qui tourne en boucle infinie il doit pouvoir afficher sur demande la température courante, et la température maximale relevée depuis le lancement proposer une implémentation basée sur les signaux SIG_ALRM, SIG_USR1 et SIG_USR2, et l'utilisation de pause(). signaux
résultat [couveep@pegtst2 os]$ ./signal2 & [1] 664 mon PID est 664 temp = 1804289383 temp = 1681692777 temp = 1714636915 temp = 1957747793 kill -SIGUSR1 664 temperature courante : 1957747793 [couveep@pegtst2 os]$ temp = 424238335 kill -SIGUSR2 664 temperature maximale enregistree : 1957747793 [couveep@pegtst2 os]$ temp = 719885386 temp = 1649760492 kill -SIGTERM 664 [1]+ Terminated ./signal2 signaux
Aspects Système Envoyer un signal à un processus revient à mettre une entrée à 1 dans un tableau (en pratique, un bit à 1 dans un mot sur 32 ou 64 bit) ce tableau se trouve dans la structure task_struct associée à chaque processus actif le système "traite" les signaux en attente lorsqu'il élit le processus (passage de actif -> élu) un processus endormi ne peut pas être élu… mais, quand un processus s'endort, il précise si il souhaite être réveillé sur reception d'un signal, ou pas. Dans ce dernier cas, il sera impossible de le "tuer", y compris avec la commande "kill -9" signaux