From bda5a6016f29033bc654de18e3cb95c9db0cf10f Mon Sep 17 00:00:00 2001 From: solar Date: Mon, 6 Oct 2025 16:48:30 +0200 Subject: [PATCH] tkt --- SCR3.1/TP5/Exo1/a.out | Bin 0 -> 71184 bytes SCR3.1/TP5/Exo1/pipe-ex.c | 183 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100755 SCR3.1/TP5/Exo1/a.out create mode 100644 SCR3.1/TP5/Exo1/pipe-ex.c diff --git a/SCR3.1/TP5/Exo1/a.out b/SCR3.1/TP5/Exo1/a.out new file mode 100755 index 0000000000000000000000000000000000000000..ac8f247899330aa409bd6f2c75fed2608c48300b GIT binary patch literal 71184 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 z +#include +#include +#include +#include +#include + +#define READ_END 0 +#define WRITE_END 1 + +// Fonction pour la gestion des erreurs +void error_exit(const char *msg) { + perror(msg); + exit(EXIT_FAILURE); +} + +// Fonction du processus Pf2 (Écriture) +void process_pf2(int pipefd[2]) { + // Pf2 n'a besoin que de l'extrémité d'écriture du tube + if (close(pipefd[READ_END]) == -1) { + error_exit("Pf2: close(READ_END)"); + } + + printf("Pf2 (PID: %d) démarré. Écrit toutes les 3 secondes.\n", getpid()); + + pid_t pid_to_write; + + while (1) { + pid_to_write = getpid(); + ssize_t bytes_written = write(pipefd[WRITE_END], &pid_to_write, sizeof(pid_t)); + + if (bytes_written == -1) { + if (errno == EPIPE) { + // Le tube a été fermé par le lecteur (Pf1f1) + fprintf(stderr, "Pf2 (PID: %d): Erreur: Pipe fermé. Arrêt de l'écriture.\n", getpid()); + break; + } + error_exit("Pf2: write"); + } + + printf("Pf2 (PID: %d) écrit: %d (taille: %zd octets)\n", getpid(), pid_to_write, bytes_written); + + // Attendre 3 secondes + sleep(3); + } + + // Fermer l'extrémité d'écriture avant de terminer + if (close(pipefd[WRITE_END]) == -1) { + error_exit("Pf2: close(WRITE_END) final"); + } + exit(EXIT_SUCCESS); +} + +// Fonction du processus Pf1f1 (Lecture) +void process_pf1f1(int pipefd[2]) { + // Pf1f1 n'a besoin que de l'extrémité de lecture du tube + if (close(pipefd[WRITE_END]) == -1) { + error_exit("Pf1f1: close(WRITE_END)"); + } + + printf("Pf1f1 (PID: %d) démarré. Lit toutes les 1 seconde.\n", getpid()); + + pid_t received_pid; + ssize_t bytes_read; + + while (1) { + bytes_read = read(pipefd[READ_END], &received_pid, sizeof(pid_t)); + + if (bytes_read == -1) { + error_exit("Pf1f1: read"); + } else if (bytes_read == 0) { + // Fin de fichier (l'écrivain Pf2 a fermé son extrémité) + printf("Pf1f1 (PID: %d): Fin du tube détectée. Arrêt de la lecture.\n", getpid()); + break; + } else if (bytes_read != sizeof(pid_t)) { + // Lecture partielle inattendue + fprintf(stderr, "Pf1f1 (PID: %d): Avertissement: Lecture partielle (%zd octets au lieu de %zu)\n", + getpid(), bytes_read, sizeof(pid_t)); + } else { + // Lecture réussie + printf("Pf1f1 (PID: %d) lit: %d (taille: %zd octets)\n", getpid(), received_pid, bytes_read); + } + + // Attendre 1 seconde + sleep(1); + } + + // Fermer l'extrémité de lecture avant de terminer + if (close(pipefd[READ_END]) == -1) { + error_exit("Pf1f1: close(READ_END) final"); + } + exit(EXIT_SUCCESS); +} + +int main(void) { + int pipefd[2]; + pid_t pid_pf2, pid_pf1, pid_pf1f1; + + printf("Processus P (PID: %d) démarré.\n", getpid()); + + // 1. Créer le tube entre Pf2 et Pf1f1 + if (pipe(pipefd) == -1) { + error_exit("pipe"); + } + printf("Tube créé: descripteur de lecture=%d, descripteur d'écriture=%d\n", + pipefd[READ_END], pipefd[WRITE_END]); + + // 2. Créer Pf2 + pid_pf2 = fork(); + if (pid_pf2 == -1) { + error_exit("fork Pf2"); + } + + if (pid_pf2 == 0) { + // Code de Pf2 + process_pf2(pipefd); + } + + // Processus P (continue) + // 3. Créer Pf1 + pid_pf1 = fork(); + if (pid_pf1 == -1) { + error_exit("fork Pf1"); + } + + if (pid_pf1 == 0) { + // Code de Pf1 + printf("Pf1 (PID: %d) démarré. Création de Pf1f1.\n", getpid()); + + // 4. Créer Pf1f1 (fils de Pf1) + pid_pf1f1 = fork(); + if (pid_pf1f1 == -1) { + error_exit("fork Pf1f1"); + } + + if (pid_pf1f1 == 0) { + // Code de Pf1f1 + process_pf1f1(pipefd); + } else { + // Pf1 attend la terminaison de Pf1f1 + printf("Pf1 (PID: %d) attend Pf1f1 (PID: %d).\n", getpid(), pid_pf1f1); + + // Pf1 ne lit ni n'écrit dans le tube, donc il doit fermer les deux descripteurs hérités + if (close(pipefd[READ_END]) == -1) { + error_exit("Pf1: close(READ_END)"); + } + if (close(pipefd[WRITE_END]) == -1) { + error_exit("Pf1: close(WRITE_END)"); + } + + if (waitpid(pid_pf1f1, NULL, 0) == -1) { + error_exit("waitpid Pf1f1"); + } + printf("Pf1 (PID: %d): Pf1f1 terminé.\n", getpid()); + exit(EXIT_SUCCESS); + } + } + + // Processus P (attente des enfants) + printf("P (PID: %d) attend Pf2 (PID: %d) et Pf1 (PID: %d).\n", getpid(), pid_pf2, pid_pf1); + + // Le processus P ne communique pas via le tube, il doit donc fermer les descripteurs hérités + if (close(pipefd[READ_END]) == -1) { + error_exit("P: close(READ_END)"); + } + if (close(pipefd[WRITE_END]) == -1) { + error_exit("P: close(WRITE_END)"); + } + + // Attendre la terminaison des deux processus enfants directs (Pf2 et Pf1) + if (waitpid(pid_pf2, NULL, 0) == -1) { + error_exit("waitpid Pf2"); + } + printf("P (PID: %d): Pf2 terminé.\n", getpid()); + + if (waitpid(pid_pf1, NULL, 0) == -1) { + error_exit("waitpid Pf1"); + } + printf("P (PID: %d): Pf1 terminé.\n", getpid()); + + printf("P (PID: %d): Tous les processus enfants sont terminés. Sortie.\n", getpid()); + return 0; +}