diff --git a/.gitignore b/.gitignore index 4527a96..cc22819 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ user/usys.S xv6.out* .vagrant/ submissions/ +mkfs/mkfs ph barrier /lab-*.json diff --git a/Makefile b/Makefile index 77ecadc..b7593a7 100644 --- a/Makefile +++ b/Makefile @@ -190,6 +190,7 @@ UPROGS=\ $U/_zombie\ $U/_sleep\ $U/_pingpong\ + $U/_primes\ diff --git a/mkfs/mkfs b/mkfs/mkfs old mode 100644 new mode 100755 index f849fd5..7a0d222 Binary files a/mkfs/mkfs and b/mkfs/mkfs differ diff --git a/user/primes.c b/user/primes.c new file mode 100644 index 0000000..d65494e --- /dev/null +++ b/user/primes.c @@ -0,0 +1,61 @@ +#include "kernel/types.h" +#include "user/user.h" + +void redirect(int n, int pd[]) { + close(n); + dup(pd[n]); + close(pd[0]); + close(pd[1]); +} + +void primes() { + int previous, next; + int fd[2]; + + while (read(0, &previous, sizeof(int))) { + printf("prime %d\n", previous); + + if (pipe(fd) < 0) { + fprintf(2, "pipe failed\n"); + exit(1); + } + + if (fork() == 0) { + redirect(1, fd); + while (read(0, &next, sizeof(int))) { + if (next % previous != 0) { + write(1, &next, sizeof(int)); + } + } + exit(0); + } else { + close(fd[1]); + redirect(0, fd); + } + } +} + +int main(int argc, char *argv[]) { + int fd[2]; + + if (pipe(fd) < 0) { + fprintf(2, "pipe failed\n"); + exit(1); + } + + if (fork() == 0) { + redirect(1, fd); + for (int i = 2; i < 36; i++) { + write(1, &i, sizeof(int)); + } + exit(0); + } else { + close(fd[1]); + redirect(0, fd); + primes(); + } + + exit(0); +} + +