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