📄 relay.c
字号:
#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <sys/types.h>#include <sys/poll.h>#define BUFSIZE 32static intmax(int a, int b){ return a>=b?a:b;}intrelay(int fd1, int fd2){ int r1, w2, r2, w1; int ret; int fd1save, fd2save; char buf12[BUFSIZE], buf21[BUFSIZE]; int len12, pos12, len21, pos21; struct pollfd fds[2]; fd1save=fcntl(fd1, F_GETFL); ret=fcntl(fd1, F_SETFL, fd1save|O_NONBLOCK); if (ret==-1) { return -1; } fd2save=fcntl(fd2, F_GETFL); ret=fcntl(fd2, F_SETFL, fd2save|O_NONBLOCK); if (ret==-1) { fcntl(fd1, F_SETFL, fd1save); return -1; } fds[0].fd=fd1; fds[1].fd=fd2; r1=1; w2=0; r2=1; w1=0; while (r1+w2+r2+w1) { fds[0].events=0; fds[1].events=0; if (r1) { fds[0].events |= POLLIN; } if (w2) { fds[1].events |= POLLOUT; } if (r2) { fds[1].events |= POLLIN; } if (w1) { fds[0].events |= POLLOUT; } ret=poll(fds, 2, -1); if (ret==-1) { if (errno==EINTR) { continue; } perror("poll()"); break; }fprintf(stderr, "poll()=%d\n", ret); if (fds[0].revents & POLLIN) { len12=read(fd1, buf12, BUFSIZE); pos12=0; if (len12==-1) { if (errno!=EAGAIN) { r1=0; w2=0; } } else if (len12==0) { r1=0; w2=0; } else { r1=0; w2=1; } } if (fds[1].revents & POLLOUT) { ret=write(fd2, buf12+pos12, len12); if (ret==-1) { if (errno!=EAGAIN) { r1=0; w2=0; } } else { pos12+=ret; len12-=ret; if (len12==0) { r1=1; w2=0; } } } if (fds[1].revents & POLLIN) { 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 (fds[0].revents & POLLOUT) { 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; } } } } 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 + -