Vous êtes sur la page 1sur 4

Les Signaux

Un signal traduit l'apparition d'un vnement asynchrone l'excution d'un processus. Il peut tre gnr par : Le noyau (par exemple, si un processus accde une zone mmoire non autorise : signal SIGSEGV) Un appel systme kill qui permet d'envoyer un signal vers un processus identifi par son pid. Le processus lui-mme (par exemple, un processus initialise une alarme (appel alarm) et lorsque que cette alarme expire, le noyau lui envoie le signal SIGALRM). la frappe d'une touche par l'utilisateur du terminal (par exemple [CTRL-C] gnre le signal SIGINT dont l'action par dfaut est de terminer le processus).

Contrle des signaux


A chaque signal est associ un pointeur vers une fonction qui est appele lors de l'activation du signal. Il est possible de modifier le pointeur de cette fonction sauf pour les signaux SIGKILL et SIGSTOP. Trois comportements sont possibles dans la gestion des signaux : c'est la fonction par dfaut du Kernel qui traite le signal l'utilisateur fournit une fonction pour traiter le signal l'activation du signal est ignore

Type de signaux
Pour le programmeur un signal est reprsent dans le systme par un nom de la forme SIGXXX. La lsiet complte est obtenue par la commande : kill -l
# kill -l

Numro Signal 1 2 3 4 5 6 SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT

Signification hangup : envoie un signal de rinitialisation Interruption Core dump : gnre un fichier core. Le programme tente d'excuter du code malform, inconnu ou avec de mauvais privilges Le programme envoie un signal au dbugger (message captur) Abort : arrt immdiat du processus

Numro Signal 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 34-50 51-64 SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2 SIGPIPE SIGALRM SIGTERM SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGIO SIGPWR SIGSYS SIGRTMAX-n /SIGRTMAX

Signification Le programme a caus une erreur de bus floating-point exception : le programme a ralis une opration arithmtique errone arrte le programme immdiatement Envoie un signal dans des conditions dfinies par un utilisateur Segmentation fault : le programme fait rfrence un mauvais emplacement de mmoire Envoie un signal dans des conditions dfinies par un utilisateur Un programme tente d'crire dans un pipe sans processus connect l'autre bout La limite de temps est dpasse Envoie un signal au programme pour le terminer child : signal envoy par un programme lorsqu'un processus fils est achev Redmarre un programme suspendu par STOP signal demandant au programme de se suspendre tty stop : signal envoy au programme lorsqu'un terminal suspend ses requtes Le programme tente de lire tty alors qu'il est en arrire-plan Le programme tente d'crire sur tty alors qu'il est en arrireplan Un socket a une donne urgente lire Le programme a utilis le CPU prend trop longtemps Le fichier a dpass la taille maximale autorise virtual alarm : signal envoy lorsque le temps limite a t dpass profiler : signal envoy lorsqu'un timer a expir window [size] change : signal envoy au programme lorsque la fentre de contrle change de taille IO : entre sortie (fichier) power : le systme subit un problme d'alimentation Un mauvais argument est pass en paramtre

SIGRTMIN/SIGRTMIN+n real-time minimum : signaux dfinis par l'application real-time maximum : signaux dfinis par l'application

Remarque
Il existe aussi des pseudo signaux comme le signal 0 (EXIT) qui est la valeur retourne par la fin sans erreur d'un script. C'est aussi la valeur retourne par le shell lors de la dconnexion. Lorsqu'un shell UNIX s'achve soit de lui-mme soit par une erreur (interuption par ctrl+C, une erreur de syntaxe ou de commande, ...) il se peut que les rpertoires ne soient pas propres ou remis en tat. En effet, surtout dans le cas d'une fin en erreur, en fonction de l'endroit o le script s'est arrt, les gnrations de fichiers et/ou de donnes n'tant pas finies, tout n'est pas forcment propre et cohrent. Dans certains cas, il peut mme tre utile d'excuter un autre script en cas d'erreur afin, par exemple, d'envoyer un message d'alerte, effectuer une restauration ou une sauvegarde, ... Malheureusement, pour raliser tout cela il faut pouvoir ragir en fonction du type d'arrt de script. trap est la commande qui permet justement de faire cela.

Syntaxe
trap 'commande' liste_de_signaux

Le numro de signal correspond ceux qu'on obtient avec la commande kill -l. Avec trap on peut soit utiliser le signal, soit son numro. La commande est soit une (liste de) commande(s) excute(s) en direct soit un appel de fonction. La commande trap sert dans deux cas bien distincts : demander une action qui s'interrompt en erreur ou qu'on veut interrompre d'effectuer une ou plusieurs commandes avant d'arrter le traitement. Par exemple :
trap "echo FIN; exit 0" 2 3 15

empcher qu'une squence de commandes ne soit interrompue par la rception d'un signal.
trap "" 1 2 3 15 # ignorer les signaux commande ... trap 1 2 3 15 # revenir l'tat par dfaut

Exemples
Empcher l'interruption d'un programme
#!/bin/sh trap "" 2 3 15 # ignorer les signaux while : do echo "Entrez le mot de passe : \c" read mdp

if [ "${mdp}" = "test" ] then echo "mot de passe valide !" break fi done trap 2 3 15 # revenir l'tat par dfaut

Cet exemple montre que la boucle ne peut pas tre interrompue, sauf par l'entre du bon mot de passe. En effet, le script commence par mettre de ct les signaux en leur affectant une excution vide. trap ne remettra en place correcte le contexte qui si la boucle s'achve avec succs (entre du bon mot de passe). Ainsi, l'utilisateur, quoi qu'il fasse ne peut pas interrompre le programme. Ignorer un signal
trap "" 2 # ignorer le signal

Ignorer un ensemble de signaux


trap "" 2 3 15 # ignorer les signaux

Revenir l'action par dfaut


trap 2 # retablir la situation

Utiliser les mnmoniques


trap "echo CTRL-C" INT # retablir la situation

Excuter un script la dconnexion Pour excuter un script automatiquement la dconnexion, il faut d'abord ajouter au fichier .profile :
trap "~/logoff" 0

Puis crer le script logoff en question :


#!/bin/sh rm /tmp/*.tmp clear echo "Suppression des fichiers temporaires termine" echo "Dconnexion..."

Ne pas oublier de rendre le script excutable...