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
| #include <sys/mode.h> // Modes et droits fichiers
#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
extern const char* const sys_errlist[]; // Liste messages erreurs
#define SZ_STRING (100) // Taille message
// Fonction principale
main()
{
// Déclaration des variables
int pid; // No process
int fin_fils; // No fils fini
int status; // Etat fin fils
int tube[2]; // Tableau extrémités tube
char chaine[SZ_STRING]; // Chaine stockage message
// Création tube memoire
if (pipe(tube) != 0)
{
fprintf(stderr, "ligne %u - pipe() - %s\n", __LINE__, sys_errlist[errno]);
exit(errno);
}
// Création du process fils
switch(pid=fork())
{
case (-1): // Erreur de fork
fprintf(stderr, "ligne %u - fork() - %s\n", __LINE__, sys_errlist[errno]);
exit(errno);
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, SZ_STRING);
printf("\tFils(%u) - J'ai reçu '%s'\n", getpid(), chaine);
}
// Fermeture coté utilisé
close(tube[0]);
// Arret du fils
printf("\tFils(%d) - Je m'arrête\n", getpid());
exit(0);
default: // Père
// Fermeture coté inutilisé
close(tube[0]);
printf("Je suis le père %u de mon fils %u\n", getpid(), pid);
// Boucle d'écriture
while (strcmp(chaine, "EOT\n") != 0)
{
// Saisie et envoi de la chaine
printf("Père(%u) - Entrez une chaine (EOT pour sortir):", getpid());
fflush(stdin);
fgets(chaine, SZ_STRING, stdin);
write(tube[1], chaine, strlen(chaine) + 1);
}
// Fermeture coté utilisé
close(tube[1]);
// Attente mort de mon fils
wait(&status);
printf("Mon fils %u vient de mourir - Mort(%u)\n", pid, WEXITSTATUS(status));
}
} |
Partager