Cours 6 : Signaux
Signaux
Signal : envoyé avec la commande kill
NB : les signaux sont très primitifs ⟶ on ne peut pas transmettre de données avec.
kill -l
:-
liste tous les signaux possibles qu’on peut envoyer (la plupart tuent le processus qui les reçoit, on différencie juste les raisons).
Exs :
2 : SIGINT
: l’effet de Ctrl+C (“INTerrupt”)4 : SIGILL
: processus tué (par le noyau) car il a tenté quelque chose d’illégal-
15 : SIGTERM
: avant d’éteindre l’ordinateur ⟶ pour dire “attention :9 : SIGKILL
imminent !”- ex : pour envoyer une alerte pour sauvegarder son fichier, avant de quitter l’éditeur
SIGALARM
: utilisé parsleep
,alarm
, …SIG_CORE
: on termine, puis on crée un fichiercore
où est consigné l’état du processus.9 : SIGKILL
: mort immédiate : ne peut pas être rattrapé, par aucun processus (c’est l’Avada Kedavra des signaux).
alarm(nb_sec)
:-
signal
SIGALARM
envoyé au bout denb_sec
secondes, puis : comportement par défaut = “terminer”.
Ex d’utilisation : kill -9 programme
OU kill -KILL programme
(programme
peut être remplacé par son PID).
kill
: signaux ne peuvent pas être envoyés à un autre utilisateur, sauf si on est root (tu veux fermer tous les programmes du tondu d’à côté ? Nah ! Interdit, à part si t’es le Chérif).
signal(SIGALARM, function)
:-
appelle la fonction
function
dès que le signalSIGNALARM
est détecté.
signal(SIGKILL, SIG_IGN)
OU signal(SIGTERM, SIG_IGN)
OU signal(SIGINT, SIG_IGN)
: pour ignorer les signaux émis, MAIS :
signal(SIGKILL, SIG_IGN)
; ne marchera pas : impossible d’ignorer un SIGKILL
.
NB :
- c’est pareil que :
void handler (){}
signal(SIGINT, handler)
sleep
: n’attend pas si un signal d’arrêt a été envoyé.
sigaction
: comme signal
(qui est déprécié), mais plus compliqué à utiliser.
SIGCHILD
: envoyé par le fils. Peut être utilisé, au lieu de faire un wait
depuis le père.
Ctrl+S
/ Ctrl + U
: arrêter la sortie / la reprendre.
- Fonction réentrante :
-
plusieurs instances peuvent l’invoquer parallèlement.
Attention : ne pas appeler de fonction qui n’est pas réentrante (comme
malloc
) dans unhandler
⟶ on ne sait pas quand on va recevoir le signal (si ça arrive pendant que le
malloc
du programme principal s’exécute, c’est la cata !)
- PGID :
-
process group identifier : ID du groupe auquel appartient le processus.
NB : quand on tape Ctrl+C
: le terminal envoie le signal au groupe de processus actif
⟶ tous les membres du groupe sont tués.
setpgid(processus, pgid)
:-
on affecte l’id
pgid
à un groupe, auquel on affecte le processusprocessus
. killall programme
:-
tue le processus de nom
programme
. fg programme
/bg programme
:-
on passer le processus
programme
au premier plan (foreground) / arrière plan (background).
Leave a comment