« Programmation C/Gestion des signaux » : différence entre les versions

Contenu supprimé Contenu ajouté
Greudin (discussion | contributions)
m oops
→‎Envoi d'un signal : wiki et précisions
Ligne 7 :
 
==Envoi d'un signal==
LaL'en-tête bibliothèque "<tt>signal.h"</tt> nous fournit la primitive kill (PID, signal) pour envoyer un signal :fonction
<source lang="c">
*PID > 0 : identifiant d'un processus
int kill(pid_t pid, int sig);
*PID = 0 : le signal sera envoyé à tous les processus du groupe processus
</source>
*PID = -1 : le signal sera envoyé à tous les processus de l'utilisateur. En super-utilisateur (uid=0) tous les processus (sauf système) reçoivent le signal.
Le paramètre <tt>pid</tt> permet d'identifier le ou les processus qui recevront le signal:
*PIDpid > 0 : identifiant d'un processus;
*PIDpid == 0 : le signal sera envoyé à tous les processus du groupe du processus courant;
*PIDpid == -1 : le signal sera envoyé à tous les processus de l'utilisateur. En super-utilisateur (uid=0), tous les processus (sauf système) reçoivent le signal.
 
=== Exemple ===
Par exemple, un processus fils envoie le signal <tt>SIGFPE</tt> a son père qui a pour fonction d'afficher dix fois le message "Pere\n". Le processus fils enverra le signal <tt>SIGFPE</tt> (''floating point exception'', exception de virgule flottante) :
kill(0, SIGFPE);
 
<source lang="c">
Ligne 21 ⟶ 25 :
int main(void)
{
int pid_t pid;
int iterations = 10;
 
pid = fork();
 
if ( pid > 0 )
}{
while (iterations--)
{
while (iterations --) printfputs("Pere\n");
}
else {
printf("fils\n");
kill(0, SIGFPE);
}
}
else if (pid == 0)
{
puts("Fils");
kill(0, SIGFPE);
}
else {
{
puts("Erreur: fork() impossible");
}
return 0;
}
</source>
 
Une sortie possible est:
Sortie :
$ cc exkill.c -o exkill
$ ./exkill
Fils
fils
Floating point exception
 
LeIci, le processus père n'a pas eu le temps d'afficher le message avant l'exécution du fils que celui -ci a généré une exception de virgule flottante. Le traitement par défaut de ce signal étant l'arrêt du processus, le père s'est terminé.
 
Il est possible, suivant la manière dont les processus sont synchronisés, que le processus père affiche une ou plusieurs lignes avant d'être interrompu par le signal.