From 0d6a64fa06ce6aae729fa05a539eadd88fa59007 Mon Sep 17 00:00:00 2001
From: Mole Shang <135e2@135e2.dev>
Date: Wed, 17 Jan 2024 11:33:39 +0800
Subject: lab util: finish

---
 user/primes.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 user/primes.c

(limited to 'user/primes.c')

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];
+}
-- 
cgit v1.2.3