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