commit 4ba670fe6221301665146418babede21d9f3cfef
parent 6bad484a354ed430735733a969df3aa663e2c0b0
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 26 Aug 2025 08:08:03 +0900
fork reader and writer
Diffstat:
| M | cons/cons.c | | | 76 | ++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- | 
1 file changed, 48 insertions(+), 28 deletions(-)
diff --git a/cons/cons.c b/cons/cons.c
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <sys/ioctl.h>
 #include <sys/termios.h>
+#include <sys/wait.h>
 #include <unistd.h>
 
 int device_open();
@@ -13,12 +14,14 @@ int flush(int fd);
 
 #define ERRLEN 128
 char err[ERRLEN];
+#define BUFSIZE 16
 
 int
 main(void)
 {
 	int fd;
 	int ret = 0;
+	int cret;
 	struct termios *term;
 	
 	fd = device_open();
@@ -37,41 +40,58 @@ main(void)
 		goto defer;
 	}
 
-	char buf[10];
-	int n;
-	for (;;) {
-		n = read(0, buf, 10);
-		if (n == 0) {
-			fprintf(stderr, "eof\n");
-			break;
-		} else if (n < 0) {
-			fprintf(stderr, "read stdin: %s\n", strerror(errno));
-			ret = errno;
-			goto defer;
-		}
-		n = write(fd, buf, n);
-		if (n < 0) {
-			fprintf(stderr, "write to tty %s\n", strerror(errno));
-			ret = errno;
-			goto defer;
-		}
-		n = read(fd, buf, 10);
-		if (n < 0) {
-			fprintf(stderr, "read tty: %s\n", strerror(errno));
-			ret = errno;
-			goto defer;
+	if (fork() == 0) {
+		int n;
+		char buf[BUFSIZE];
+		int ret = 0;
+		for (;;) {
+			n = read(0, buf, BUFSIZE);
+			if (n == 0) {
+				fprintf(stderr, "eof\n");
+				break;
+			} else if (n < 0) {
+				fprintf(stderr, "read stdin: %s\n", strerror(errno));
+				ret = 1;
+				break;
+			}
+			n = write(fd, buf, n);
+			if (n < 0) {
+				fprintf(stderr, "write to tty %s\n", strerror(errno));
+				ret = 1;
+				break;
+			}
 		}
-		n = write(1, buf, n);
-		if (n < 0) {
-			fprintf(stderr, "write to stdout %s\n", strerror(errno));
-			ret = errno;
-			goto defer;
+		_exit(ret);
+	}
+	if (fork() == 0) {
+		int n;
+		char buf[BUFSIZE];
+		int ret = 0;
+		for (;;) {
+			n = read(fd, buf, BUFSIZE);
+			if (n < 0) {
+				fprintf(stderr, "read tty: %s\n", strerror(errno));
+				ret = 1;
+				break;
+			}
+			n = write(1, buf, n);
+			if (n < 0) {
+				fprintf(stderr, "write to stdout %s\n", strerror(errno));
+				ret = 1;
+				break;
+			}
 		}
+		_exit(ret);
 	}
 
+	wait(&cret);
 defer:
 	close(fd);
+	if (ret == 0) {
+		ret = cret;
+	}
 	return ret;
+		int n;
 }
 
 int