Files
2026-10-07 17:19:14 +02:00

75 lines
1.1 KiB
C

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <signal.h>
void seq(int n)
{
for(int i = 2; i <= n; i++)
write(STDOUT_FILENO, &i, sizeof i);
exit(0);
}
void filtre(int prime)
{
while(1){
int n;
ssize_t nb_read = read(STDIN_FILENO, &n, sizeof n);
if (nb_read <= 0)
break;
if ((n%prime) != 0)
write(STDOUT_FILENO, &n, sizeof n);
}
exit(0);
}
int main(int argc, char *argv[])
{
pid_t p;
int fd[2];
struct sigaction sa = {0};
sa.sa_handler = SIG_IGN;
sigaction(SIGCHLD, &sa, NULL);
int N = strtol(argv[1], NULL, 0);
assert(pipe(fd) == 0);
p = fork();
if (p == 0){
close(fd[0]);
dup2(fd[1],STDOUT_FILENO);
close(fd[1]);
seq(N);
}
close(fd[1]);
dup2(fd[0],STDIN_FILENO);
close(fd[0]);
while(1){
int prime;
int fdd[2];
ssize_t nb_read = read(STDIN_FILENO, &prime, sizeof prime);
if (nb_read <= 0)
break;
printf("%d\n",prime);
assert(pipe(fdd) == 0);
p = fork();
if (p == 0){
close(fdd[0]);
dup2(fdd[1],STDOUT_FILENO);
close(fdd[1]);
filtre(prime);
}
close(fdd[1]);
dup2(fdd[0], STDIN_FILENO);
close(fdd[0]);
}
return 0;
}