📄 relay2.c
字号:
#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <sys/types.h>#define BUFSIZE 32struct job_st { int fd1, fd2; int fd1save, fd2save; int r1, w2, r2, w1; char buf12[BUFSIZE], buf21[BUFSIZE]; int len12, pos12, len21, pos21;};intdo_relay(struct job_st *p){ int ret; if (p->r1+p->w2+p->r2+p->w1) { if (p->r1) { p->len12=read(p->fd1, p->buf12, BUFSIZE); p->pos12=0; if (p->len12==-1) { if (errno!=EAGAIN) { p->r1=0; p->w2=0; } } else if (p->len12==0) { p->r1=0; p->w2=0; } else { p->r1=0; p->w2=1; } } if (p->w2) { ret=write(p->fd2, p->buf12+p->pos12, p->len12); if (ret==-1) { if (errno!=EAGAIN) { p->r1=0; p->w2=0; } } else { p->pos12+=ret; p->len12-=ret; if (p->len12==0) { p->r1=1; p->w2=0; } } }/* if (r2) { len21=read(fd2, buf21, BUFSIZE); pos21=0; if (len21==-1) { if (errno!=EAGAIN) { r2=0; w1=0; } } else if (len21==0) { r2=0; w1=0; } else { r2=0; w1=1; } } if (w1) { ret=write(fd1, buf21+pos21, len21); if (ret==-1) { if (errno!=EAGAIN) { r2=0; w1=0; } } else { pos21+=ret; len21-=ret; if (len21==0) { r2=1; w1=0; } } }*/ } return 0;}intrelay(struct job_st *p){ p->fd1save=fcntl(p->fd1, F_GETFL); ret=fcntl(p->fd1, F_SETFL, p->fd1save|O_NONBLOCK); if (ret==-1) { return -1; } p->fd2save=fcntl(p->fd2, F_GETFL); ret=fcntl(p->fd2, F_SETFL, p->fd2save|O_NONBLOCK); if (ret==-1) { fcntl(p->fd1, F_SETFL, p->fd1save); return -1; } while (1) { ret=do_relay(p); if (ret==-1) { break; } } fcntl(fd1, F_SETFL, fd1save); fcntl(fd2, F_SETFL, fd2save); return 0;}intmain(){ int ret; int fd1, fd2; fd1=open("/dev/tty5", O_RDWR); if (fd1==-1) { perror("open()"); exit(1); } fd2=open("/dev/tty6", O_RDWR); if (fd2==-1) { perror("open()"); exit(1); } write(fd1, "fd1\n", 4); write(fd2, "fd2\n", 4); ret=relay(fd1, fd2); close(fd1); close(fd2); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -