summaryrefslogtreecommitdiff
path: root/user/primes.c
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2024-02-13 19:39:56 +0800
committerMole Shang <[email protected]>2024-02-13 19:39:56 +0800
commit89ef6f717ed4b3e702e5f6f906f58fe1ea27d366 (patch)
tree760cce316675479a6cca77551438e8d2cc5fe9ae /user/primes.c
parentcfae93475dfb4cb5cfe264f4c029136e1447c262 (diff)
parent4a6593f1a6f666c618d303a4858c4c6d31b41c63 (diff)
downloadxv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.gz
xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.bz2
xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.zip
Merge branch 'cow' into net
Conflicts: .gitignore Makefile conf/lab.mk kernel/defs.h kernel/syscall.c kernel/vm.c user/pingpong.c user/user.h user/usys.pl
Diffstat (limited to 'user/primes.c')
-rw-r--r--user/primes.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/user/primes.c b/user/primes.c
new file mode 100644
index 0000000..b359524
--- /dev/null
+++ b/user/primes.c
@@ -0,0 +1,74 @@
+#include "kernel/types.h"
+#include "user/user.h"
+
+#define MAX 36
+#define FIRST_PRIME 2
+
+int
+generate_natural(); // -> out_fd
+int
+prime_filter(int in_fd, int prime); // -> out_fd
+
+int
+main(int argc, char* argv[])
+{
+ int prime;
+
+ int in = generate_natural();
+ while (read(in, &prime, sizeof(int))) {
+ // printf("prime %d: in_fd: %d\n", prime, in); // debug
+ printf("prime %d\n", prime);
+ in = prime_filter(in, prime);
+ }
+
+ close(in);
+
+ exit(0);
+}
+
+int
+generate_natural()
+{
+ int out_pipe[2];
+
+ pipe(out_pipe);
+
+ if (!fork()) {
+ for (int i = FIRST_PRIME; i < MAX; i++) {
+ write(out_pipe[1], &i, sizeof(int));
+ }
+ close(out_pipe[1]);
+
+ exit(0);
+ }
+
+ close(out_pipe[1]);
+
+ return out_pipe[0];
+}
+
+int
+prime_filter(int in_fd, int prime)
+{
+ int num;
+ int out_pipe[2];
+
+ pipe(out_pipe);
+
+ if (!fork()) {
+ while (read(in_fd, &num, sizeof(int))) {
+ if (num % prime) {
+ write(out_pipe[1], &num, sizeof(int));
+ }
+ }
+ close(in_fd);
+ close(out_pipe[1]);
+
+ exit(0);
+ }
+
+ close(in_fd);
+ close(out_pipe[1]);
+
+ return out_pipe[0];
+}