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é par sleep, alarm, …
  • SIG_CORE : on termine, puis on crée un fichier core 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 de nb_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 signal SIGNALARM 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 :

  1. c’est pareil que :
void handler (){}

signal(SIGINT, handler)
  1. 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 un handler

⟶ 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 processus processus.

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