rp2040

RP2040 Programming without SDK
Log | Files | Refs

commit 4ba670fe6221301665146418babede21d9f3cfef
parent 6bad484a354ed430735733a969df3aa663e2c0b0
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 26 Aug 2025 08:08:03 +0900

fork reader and writer

Diffstat:
Mcons/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