Qu'est-ce qu'un signal UNIX et Comment les utiliser ?

Nous allons découvrir comment utiliser les signaux UNIX pour communiquer entre différents programmes. Par la suite, nous créerons une communication textuelle entre un client et un serveur.

Niveau Débutant
13 minutes de lecture
Comment utiliser les signaux UNIX

Prérequis:

  • Notion avancée en langage C ou C++
  • Notion de base en Réseau Description

Introduction - UNIX c'est quoi ?

UNIX est un système d'exploitation multi-utilisateur et multitâche conçu pour fournir une interface cohérente et standardisée pour le développement et l'exécution de logiciels. Développé initialement dans les années 1970 par Ken Thompson, Dennis Ritchie et d'autres membres des Bell Labs, UNIX a influencé de nombreux systèmes d'exploitation modernes tels que Windows, Linux et MacOS. En gros, UNIX c'est vraiment la base de tout les OS que vous utilisez aujourd'hui.

Qu'est-ce qu'un signal UNIX ?

Les signaux UNIX sont des mécanismes de communication entre processus (programmes exécutés sur un ordinateur) qui permettent à un programme d'informer un autre programme d'un événement particulier. Ils sont largement utilisés pour gérer les interruptions, les erreurs, et d'autres conditions nécessitant une attention immédiate. Un signal est une notification asynchrone* envoyée à un processus pour l'informer qu'un événement particulier s'est produit. Ils sont utilisés pour la communication entre différents processus en cours d'exécution sur le même système. Par exemple, un processus peut envoyer un signal à un autre pour lui demander d'arrêter son exécution ou pour lui signaler une condition d'erreur. Chaque signal a un numéro unique et un nom symbolique. Par exemple, le signal SIGINT est envoyé lorsqu'on interrompt un programme via Ctrl+C, et le signal SIGTERM est utilisé pour demander l'arrêt contrôlé* d'un programme (Il en existe plein d’autres que nous verrons juste après). Certains signaux permettent de gérer les interruptions utilisateur ou système. Par exemple, lorsqu'un utilisateur veut arrêter un programme en cours d'exécution, il peut utiliser Ctrl+C, envoyant ainsi un SIGINT au programme. D’autres, peuvent signaler des erreurs comme des violations d'accès à la mémoire (SIGSEGV), permettant ainsi aux programmes de réagir de manière appropriée, par exemple en nettoyant les ressources avant de se terminer. Mais comment peut réagir un processus face à l'arrivée d’un signal ? Un processus peut intercepter un signal et exécuter une fonction spécifique appelée gestionnaire de signal (Signal Handler). Cela permet de personnaliser la réaction du programme face à différents signaux (Eh Hop ! Si vous avez suivi ce que nous ferons en pratique vous commencez deja a voir le truc venir. Mais nous verrons cela dans les chapitres suivants). Il peut également choisir d'ignorer certains signaux. Par exemple, il peut ignorer SIGTERM si l'arrêt contrôlé n'est pas souhaité ou pas possible à ce moment-là. Certains signaux ne peuvent pas être ignorés, par exemple, le SIGKILL (signal de terminaison forcée) ne peut pas être intercepté ou ignoré, et il termine immédiatement le processus. Ce sont des outils puissants pour la gestion des processus et la communication interprocessus, offrant une grande flexibilité et contrôle aux développeurs pour gérer diverses conditions de manière efficace et réactive.

Asynchrone signifie que la notification (le signal) peut arriver à n'importe quel moment, indépendamment de l'état du programme récepteur. Cela permet une gestion flexible et réactive des événements.

Arrêt contrôlé d'un programme signifie terminer son exécution de manière ordonnée et contrôlée, en nettoyant les ressources utilisées

Principaux signaux UNIX

Voici quelques-uns des signaux UNIX les plus couramment utilisés :

  • SIGINT : Interruption du programme (Ctrl+C).
  • SIGTERM : Demande d'arrêt contrôlé du programme.
  • SIGKILL : Forcer l'arrêt du programme (ne peut pas être ignoré).
  • SIGUSR1 et SIGUSR2 : Signaux définis par l'utilisateur pour une utilisation spécifique (Gardez bien ces deux là en tête nous en aurons besoin).

Qu'est qu'un PID et a quoi sert il ?

Un PID (Process Identifier) est un numéro unique attribué à chaque processus en cours d'exécution sur un système d'exploitation. Le PID est utilisé par le système pour suivre et gérer les processus en cours. Chaque processus en cours d'exécution se voit attribuer un PID unique, ce qui permet au système d'exploitation de distinguer les différents processus, cela sert principalement à la gestion des ressources, la communication entre processus et la supervision des tâches par le système d’exploitation. Exemple: Je lance Firefox, mon système d’exploitation lui donne donc un identifiant unique: 643942. C’est avec celui-ci que le système interagit avec Firefox, si je ferme et relance Firefox, le PID changera. Maintenant, disons que je veux fermer ce programme en lui envoyant un signal. Pour cela, vous pouvez utiliser la commande "kill" dans une fenêtre de terminal pour envoyer un signal aux processus. Ce signal indique au processus de se terminer. Ainsi, dans cet exemple, le signal (la commande "kill") est utilisé pour demander qu'une action particulière (fin du processus) soit entreprise par le processus Firefox. Pour envoyer un signal à un certain processus, vous avez besoin du PID. Pour le trouver en ligne de commande vous pouvez taper la commande suivante:

Cela me donne le PID du programme Firefox que je peux fermer en exécutant la commande

Cette commande envoie un signal UNIX au programme Firefox lui demandant l'arrêt du processus. En résumé, le PID est un outil important pour la gestion efficace des processus dans un système d'exploitation, permettant de suivre, contrôler et interagir avec les processus de manière précise et organisée.

Rejoindre la communauté de développeurs

Rejoins notre communauté de développeurs pour progresser et t'améliorer

Comment les utiliser en règle générale ?

Bien, nous avons appris théoriquement ce que sont ces fameux signaux et comment ils fonctionnent. Maintenant nous allons voir comment les utiliser de manière théorique (Pas d'inquiétude, la pratique arrive bientôt). Chaque signal peut avoir un gestionnaire de signal, qui est une fonction automatiquement appelée lorsque le processus reçoit ce signal. Cette fonction est appelée en mode asynchrone, ce qui signifie qu'elle n'est pas directement invoquée par le programme. Lorsque le signal est envoyé, le système d'exploitation interrompt temporairement l'exécution du processus pour appeler la fonction de gestion du signal. Une fois cette fonction terminée, le processus reprend là où il s'était arrêté, comme si rien ne s'était passé. Description

Les signaux agissent comme des interruptions pour les processus. Ils peuvent provenir de diverses sources : erreurs (comme l'accès à une mauvaise adresse mémoire), mort d'un processus enfant, signaux générés par l'utilisateur via la commande kill, ou autres processus utilisant des appels système (ce sont sur ces deux derniers points que nous allons nous concentrer). Un processus peut également s'envoyer un signal à lui-même ou à un autre processus.

Comment allons-nous les utiliser ?

Maintenant que nous venons de voir comment les signaux s’utilisent en règle générale, je vais brièvement vous expliquer comment nous allons les utiliser dans ce cours. Je serais très bref sur cette partie théorique car nous verrons cela plus en détail dans la partie pratique. Alors, notre objectif à la fin de ce cours est de réussir à créer deux programmes (client et server) qui pourront communiquer ensemble, pour cela nous utiliserons les signaux. Mais comment ? L'idée est que le client puisse obtenir le PID du server afin de lui envoyer un signal. Le server quant à lui recevra le signal mais ne pourra le comprendre uniquement s'il sait quoi faire à sa réception, et c’est là qu'intervient le gestionnaire de signal du server (Signal Handler) qui lui indiquera exactement quoi faire s'il reçoit le fameux signal du client. Description Alors, sur le papier ça peut paraître assez simple néanmoins dans la pratique c’est un peu plus compliqué que ça. Mais je ne veux pas vous embrouiller la tête, nous avons pas mal d’autres points à aborder d’ici la. Si vous avez encore un peu de mal à tout comprendre, c’est normal, la suite sera beaucoup plus intuitive.

Rejoindre la communauté de développeurs

Rejoins notre communauté de développeurs pour progresser et t'améliorer

Passer au chapitre suivant :