relay.c

来自「linux源码」· C语言 代码 · 共 123 行

C
123
字号
#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <sys/types.h>#define BUFSIZE 32intrelay(int fd1, int fd2){	int r1, w2, r2, w1;	int ret;	int fd1save, fd2save;	char buf12[BUFSIZE], buf21[BUFSIZE];	int len12, pos12, len21, pos21;	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;	}	r1=1; w2=0; r2=1; w1=0;	while (r1+w2+r2+w1) {		if (r1) {			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 (w2) {			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 (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;				}			}		}		usleep(1);	}	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 + =
减小字号Ctrl + -
显示快捷键?