Ajout Exo4 TP5

This commit is contained in:
Tom MOGULJAK 2023-10-05 23:22:16 +02:00
parent eb6adbb2b5
commit 5276b50139
3 changed files with 125 additions and 1 deletions

View File

@ -459,3 +459,36 @@ ls -i -l /tmp >> log
```shell ```shell
ls . | wc -l ls . | wc -l
``` ```
## 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.

91
TP5/Exo4/exo4.c Normal file
View File

@ -0,0 +1,91 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <assert.h>
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>\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;
}