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 !
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 :
- Terminer le processus
- Ignorer le signal
- Créer un dump core
- Arrêter le processus
- 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