diff --git a/README.md b/README.md index 1d3f843..49d6da8 100644 --- a/README.md +++ b/README.md @@ -458,4 +458,37 @@ ls -i -l /tmp >> log ```shell ls . | wc -l -``` \ No newline at end of file +``` + +## Exercice 2 + +## Exercice 3 + +## Exercice 4 + +> Le but est de mettre en oeuvre le cribble d'Ératosthène à l'aide d'une chaîne de processus reliés entre eux par des pipes. +- un premier processus `P` crée un fils avec qui il est relié par un tube, et qui génére l'ensemble des nombres entre 2 et `N` (passé à la ligne de commande.) +- Lorsqu'un nombre n'a pas été cribblé par les différents filtres, et arrive jusqu'à `P`, il est premier, et `P` crée un nouveau filtre. + +``` +┌────────┐ +│ P │ +└────────┘ + +┌────────┐ ────── ┌────────┐ +│seq 2 N ├───►() ()───►│ P │ +└────────┘ ────── └────────┘ + +┌────────┐ ────── ┌────────┐ ────── ┌────────┐ +│seq 2 N ├───►() ()───►│ F2 ├───►() ()───►│ P │ +└────────┘ ────── └────────┘ ────── └────────┘ + +┌────────┐ ────── ┌────────┐ ────── ┌────────┐ ────── ┌────────┐ +│seq 2 N ├───►() ()───►│ F2 ├───►() ()───►│ F3 ├───►() ()───►│ P │ +└────────┘ ────── └────────┘ ────── └────────┘ ────── └────────┘ + +┌────────┐ ────── ┌────────┐ ────── ┌────────┐ ────── ┌────────┐ ────── ┌────────┐ +│seq 2 N ├───►() ()───►│ F2 ├───►() ()───►│ F3 ├───►() ()───►│ F5 ├───►() ()───►│ P │ +└────────┘ ────── └────────┘ ────── └────────┘ ────── └────────┘ ────── └────────┘ +``` +> Écrire un programme correspondant à ce schéma. \ No newline at end of file diff --git a/exo1_3.c b/TP5/Exo1/exo1_3.c similarity index 100% rename from exo1_3.c rename to TP5/Exo1/exo1_3.c diff --git a/TP5/Exo4/exo4.c b/TP5/Exo4/exo4.c new file mode 100644 index 0000000..3b5c489 --- /dev/null +++ b/TP5/Exo4/exo4.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +void filter(int p) +{ + while (1) + { + int n; + ssize_t nb_read = read(0, &n, sizeof(int)); + + if (nb_read <= 0) + break; + + if ((n % p) != 0) + write(1, &n, sizeof(int)); + } +} + +void seq(int n) +{ + for (int i = 2; i <= n; i++) + write(1, &i, sizeof(int)); +} + +void chef(void) +{ + while (1) + { + int p; + pid_t f; + int t[2]; + ssize_t nb_read = read(0, &p, sizeof(int)); + + if (nb_read <= 0) + break; + + printf("new prime %d\n", p); + pipe(t); + f = fork(); + + if (f == 0) + { + close(t[0]); + dup2(t[1], 1); + close(t[1]); + filter(p); + exit(0); + } + + close(t[1]); + dup2(t[0], 0); + close(t[0]); + } +} +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + printf("Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + struct sigaction sa = {0}; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_NOCLDWAIT; + sigaction(SIGCHLD, &sa, NULL); + + int t[2]; + int N = strtol(argv[1], NULL, 0); + pipe(t); + pid_t p = fork(); + assert(p != -1); + + if (p == 0) + { + close(t[0]); + dup2(t[1], 1); + close(t[1]); + seq(N); + exit(0); + } + + close(t[1]); + dup2(t[0], 0); + close(t[0]); + chef(); + return 0; +} \ No newline at end of file