#include #include void source() { int n; for(n=2; ; n++) write(1, &n, sizeof(n)); } void filter(int p) { int n; for( ; ; ) { read(0, &n, sizeof(n)); if(n%p != 0) write(1, &n, sizeof(n)); } } /* connect stdin or stdout to pipe */ void redirect(int k, int fd[2]) { /* k=0 or 1 */ close(k); dup(fd[k]); close(fd[0]); close(fd[1]); } void sink() { int fd[2]; /* pipe file descriptors */ int p; /* a prime */ for( ; ; ) { read(0, &p, sizeof(p)); printf("%d\n", p); pipe(fd); if(fork()) { redirect(0, fd); continue; } else { /* child process */ redirect(1, fd); filter(p); } } } int main() { int fd[2]; /* pipe file descriptors */ pipe(fd); if(fork()) { redirect(0, fd); sink(); } else { /* child process */ redirect(1, fd); source(); } }