1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include <sys/wait.h> // Attente fin de process
#include <stdio.h> // I/O fichiers classiques
#include <signal.h> // Signaux de communication
#include <errno.h> // Erreurs système
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define SZ_STRING 100 // Taille message
// Fonction de détournement du signal reçu
static void trt_sig (int sig)// Signal reçu
{
// Repositionnement du détournement du signal
signal(sig, trt_sig);
}
// Fonction principale
int main (void)
{
int ret = 0;
int tube[2]; // Tableau extrémités tube
// Création tube memoire
if (pipe (tube) != 0)
{
fprintf (stderr, "ligne %u - pipe() - %s\n", __LINE__, strerror (errno));
ret = EXIT_FAILURE;
}
else
{
char chaine[SZ_STRING]; // Chaine stockage message
pid_t pid = fork();
// Création du process fils
switch (pid)
{
case -1: // Erreur de fork
fprintf (stderr, "ligne %u - fork() - %s\n", __LINE__,
strerror(errno));
ret = EXIT_FAILURE;
case 0: // Fils
// Fermeture coté inutilisé
close (tube[1]);
// Attente que le père ait commençé
sleep (1);
// Boucle de lecture
while (strcmp (chaine, "EOT\n") != 0)
{
// Lecture du tube
read (tube[0], chaine, sizeof chaine);
printf ("\tFils(%ld) - J'ai reçu '%s'\n", (long)getpid (),
chaine);
// Signal au père qu'il peut continuer
kill (getppid (), SIGALRM);
}
// Fermeture coté utilisé
close (tube[0]);
// Arret du fils
printf ("\tFils(%ld) - Je m'arrête\n", (long)getpid ());
break;
default: // Père
{
int status; // Etat fin fils
// Inhibition signal SIGALRM
signal (SIGALRM, trt_sig);
// Fermeture coté inutilisé
close (tube[0]);
printf ("Je suis le père %ld de mon fils %ld\n", (long)getpid (),
(long)pid);
// Boucle d'écriture
while (strcmp (chaine, "EOT\n") != 0)
{
// Saisie et envoi de la chaine
printf ("Père(%ld) - Entrez une chaine (EOT pour sortir):",
(long)getpid ());
fgets (chaine, SZ_STRING, stdin);
write (tube[1], chaine, strlen (chaine) + 1);
// Attente que le fils ait traité ma chaine
pause ();
}
// Fermeture coté utilisé
close (tube[1]);
// Attente mort de mon fils
wait (&status);
printf ("Mon fils %ld vient de mourir - Mort(%u)\n", (long)pid,
WEXITSTATUS (status));
}
}
}
return ret;
} |
Partager