« Programmation C/Gestion des signaux » : différence entre les versions
Contenu supprimé Contenu ajouté
Aucun résumé des modifications |
m Formatage, ajout de code |
||
Ligne 1 :
{{ébauche}}
<noinclude>{{Programmation C}}</noinclude>
Les signaux permettent une communication, assez sommaire, entre le système et un processus, ou entre différents processus. Cette communication est sommaire, car un ''signal'' ne porte qu'une seule information: son numéro, de type <
Ces signaux sont envoyés de manière ''asynchrone'': lorsqu'un processus reçoit un signal, son exécution est interrompue, et une fonction spécifique, dite ''gestionnaire de signal'', est appelée, avec en paramètre le numéro du signal reçu, pour traiter l'événement. Lorsque cette fonction se termine, le processus reprend là où il s'était arrêté.
Ligne 7 :
C'est à chaque processus de déterminer ce qu'il fait quand il reçoit un signal de numéro donné, en définissant un gestionnaire de signal pour tous les signaux qu'il le souhaite. Vous l'aurez remarqué, dans tous les exemples de ce livre rencontrés jusqu'à présent, nous ne nous sommes pas occupés de savoir quels signaux nous pourrions recevoir, et comment il fallait les traiter. En l'absence de précisions dans nos programmes, l'implémentation fournira en effet un gestionnaire de signal par défaut, qui le plus souvent se contentera d'arrêter le programme.
Les fonctions suivantes, fournies par l'en-tête <
* <
* et <
Le C définit ces deux fonctions, et pas plus, alors que les signaux peuvent faire beaucoup plus... En particulier, aucune fonction pour envoyer un signal à un autre processus n'est définie. Cela est dû au fait que, sur certains systèmes, la notion de processus n'existe pas, et une seule tâche s'exécute. Dans de telles situations, il serait aberrant de demander à un compilateur C pour un tel système de fournir des moyens de communications inter-processus ! Par contre, les communications inter-processus étant chose courante dans de nombreux autres systèmes, des extensions fournissent des moyens de le faire (voir par exemple la fonction <
== Définir un gestionnaire de signal ==
Ligne 21 :
</source>
permet de définir un gestionnaire de signal. La signature de cette fonction étant un peu complexe, on peut la simplifier en utilisant un <
<source lang="c">
Ligne 31 :
'''Le comportement de signal() varie selon les versions d’Unix, et a aussi varié au cours du temps dans les différentes versions de Linux. Évitez de l’utiliser : utilisez plutôt sigaction(2).'''
Ainsi, on voit mieux comment fonctionne cette fonction (notez que le type <
* le numéro du type de signal à traiter;
* et un pointeur vers la fonction de gestion du signal.
Le premier paramètre est le numéro du signal. La norme définit un faible nombre de signaux, par des macros dans l'en-tête <
Pour le deuxième paramètre, on peut donner trois valeurs possibles:
*<
*<
*un pointeur vers une fonction de type <
Cette fonction renvoie la valeur du dernier gestionnaire de signal pour le numéro donné (qui peut être <
En cas d'erreur, la fonction renvoie <
== Les gestionnaires de signaux ==
Ligne 54 :
</source>
Elles prennent un argument de type <
Comme on utilise <
Voici un exemple simple de définition et de mise en place d'un gestionnaire de signaux, pour le type de signal <
'''Le comportement de signal() varie selon les versions d’Unix, et a aussi varié au cours du temps dans les différentes versions de Linux. Évitez de l’utiliser : utilisez plutôt sigaction(2).'''
|