Ajout Exo4 TP5

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

36
TP5/Exo1/exo1_3.c Normal file
View File

@@ -0,0 +1,36 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(void)
{
int fd[2], p;
char c;
p = pipe(fd);
assert(p != -1);
pid_t pr = fork();
assert(pr != -1);
switch (pr)
{
case 0:
close(fd[0]);
dup2(fd[1], 1);
execl("/usr/bin/ls", "ls", ".", NULL);
exit(0);
default:
close(fd[1]);
dup2(fd[0], 0);
execl("/usr/bin/wc", "wc", "-l", NULL);
}
close(fd[0]);
return 0;
}

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;
}