Unix / Linux - Signaux et Trappes

Bonjour là-bas, futurs magiciens de l'ordinateur ! Aujourd'hui, nous plongeons dans le monde fascinant des signaux et des trappes sous Unix/Linux. Ne vous inquiétez pas si vous êtes nouveaux en programmation - je vais vous guider à travers cette aventure pas à pas, comme j'ai fait pour des centaines d'étudiants au fil des ans. Alors, embarquons ensemble dans cette excursion passionnante !

Unix / Linux - Signals and Traps

Qu'est-ce que les Signaux ?

Imaginez que vous êtes dans une cuisine de restaurant très occupée. Le chef (appelons-le Chef Unix) doit communiquer rapidement avec son personnel. Au lieu de crier par-dessus le bruit, il utilise un système de signaux manuels. C'est à peu près ce que sont les signaux dans le monde Unix/Linux - un moyen pour les processus de communiquer rapidement et efficacement.

Les signaux sont des interruptions logicielles envoyées à un programme pour indiquer qu'un événement important s'est produit. Ces événements peuvent aller des demandes utilisateur aux occurrences d'exécution exceptionnelles.

Liste des Signaux

Tout comme le Chef Unix pourrait avoir différents signaux manuels pour "plus de sel", "accélère" ou "fait une pause", les systèmes Unix/Linux ont une variété de signaux pour différents objectifs. Voici quelques-uns des plus courants :

Nom du Signal Numéro du Signal Description
SIGHUP 1 Détecté un hangup sur le terminal de contrôle ou décès du processus de contrôle
SIGINT 2 Interruption depuis le clavier (Ctrl+C)
SIGQUIT 3 Quitter depuis le clavier (Ctrl+)
SIGKILL 9 Signal de tue (ne peut pas être capturé ou ignoré)
SIGTERM 15 Signal de terminaison
SIGSTOP 17, 19, 23 Arrêter le processus (ne peut pas être capturé ou ignoré)

Actions par Défaut

Lorsqu'un signal est envoyé à un processus, le processus prendra une action par défaut à moins qu'il ne soit autrement indiqué. Ces actions par défaut sont comme les réponses instinctives de notre personnel de cuisine. Par exemple :

  1. Terminer le processus
  2. Ignorer le signal
  3. Créer un dump core
  4. Arrêter le processus
  5. Continuer un processus arrêté

Envoyer des Signaux

Maintenant, apprenons comment envoyer ces signaux. En Unix/Linux, nous utilisons la commande kill pour envoyer des signaux aux processus. Ne vous laissez pas tromper par le nom - kill ne termine pas toujours les processus ; c'est juste un moyen d'envoyer des signaux.

Voici comment vous pouvez l'utiliser :

kill -signal_name process_id

Par exemple, pour envoyer un signal SIGTERM au processus 1234 :

kill -SIGTERM 1234

Ou, en utilisant le numéro de signal :

kill -15 1234

Capturer des Signaux

Que se passerait-il si notre personnel de cuisine pouvait décider comment répondre aux signaux du Chef Unix au lieu de toujours suivre la réaction par défaut ? C'est ce que permet la capture des signaux en programmation.

Dans les scripts shell, nous utilisons la commande trap pour attraper les signaux et spécifier ce qu'il faut faire lorsqu'ils sont reçus. Voici la syntaxe de base :

trap "commande" signal(s)

Regardons un exemple :

#!/bin/bash

trap "echo Bonjour!" SIGINT SIGTERM

echo "C'est une trappe !"
while true
do
sleep 60
done

Dans ce script, s'il reçoit soit SIGINT soit SIGTERM, il affichera "Bonjour !" au lieu de se terminer. C'est comme dire à notre personnel de cuisine : "Lorsque le chef signale pour arrêter, dis 'Bonjour !' au lieu de vraiment arrêter."

Nettoyer les Fichiers Temporaires

Un usage commun des trappes est de nettoyer les fichiers temporaires avant que le script ne sorte. Voici un exemple :

#!/bin/bash

# Créer un fichier temporaire
temp_file=$(mktemp)

# Configurer une trappe pour supprimer le fichier temporaire à la sortie
trap "rm -f $temp_file" EXIT

# Utiliser le fichier temporaire
echo "Hello, World!" > $temp_file
cat $temp_file

# Le fichier temporaire sera automatiquement supprimé lorsque le script sortira

Ce script crée un fichier temporaire, écrit dedans, lit dedans, et le supprime automatiquement à la sortie, grâce à la trappe.

Ignorer des Signaux

Parfois, vous pourriez vouloir ignorer certains signaux. Dans notre analogie de cuisine, cela serait comme dire au chef : "Peu importe combien de fois vous signalez pour plus de sel, je n'en ajouterai pas plus !"

Voici comment ignorer un signal :

trap "" SIGINT

Cela indique au script de ne rien faire lorsqu'il reçoit un signal SIGINT.

Réinitialiser les Trappes

Que faire si vous voulez revenir au comportement par défaut après avoir capturé un signal ? Vous pouvez réinitialiser une trappe comme ceci :

trap - SIGINT

Cela supprime la trappe pour SIGINT, revenant au comportement par défaut.

Voici un exemple plus complet :

#!/bin/bash

# Initialement, capturer SIGINT
trap "echo Vous ne pouvez pas m'arrêter !" SIGINT

echo "Essayez de me stopper avec Ctrl+C..."
sleep 10

# Maintenant, réinitialiser la trappe
trap - SIGINT

echo "D'accord, maintenant vous pouvez me stopper avec Ctrl+C..."
sleep 10

echo "Si vous voyez ceci, vous ne m'avez pas arrêté !"

Ce script capture initialement SIGINT, puis réinitialise la trappe après 10 secondes. C'est comme dire à notre personnel de cuisine : "Ignorez le signal d'arrêt pendant 10 secondes, puis revenez à la normale."

Et voilà, les amis ! Nous avons parcouru le territoire des signaux et des trappes sous Unix/Linux. Souvenez-vous, la pratique rend parfait. Essayez d'écrire vos propres scripts, jouez avec différents signaux, et bientôt vous serez diriger votre propre orchestre de processus comme un véritable maître. Bonne programmation !

Credits: Image by storyset