#include #include #include #include #include #include #define MAXBUF 2048 int main() { char bufin[MAXBUF], bufout[MAXBUF]; fd_set rfds0, rfds1; int c, fdin, fdout, flags, i, nin, nout, state; struct timeval tv; if(!(fdin = open("/var/tmp/r.in", O_WRONLY))) err(1, "open"); if(!(fdout = open("/var/tmp/r.out", O_RDONLY))) err(1, "open"); flags = fcntl(0, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(0, F_SETFL, flags); FD_ZERO(&rfds0); FD_ZERO(&rfds1); tv.tv_sec = 0; tv.tv_usec = 1; for(;;){ /* Read from named pipe (out) and print on standard in. */ FD_SET(fdout, &rfds1); if(select(fdout+1, &rfds1, NULL, NULL, &tv) > 0){ nout = read(fdout, bufout, MAXBUF); bufout[nout] = 0; /* Ignore repetition of typed command. */ if(strcmp(bufout, bufin) == 0) bufin[0] = 0; else{ printf("%s", bufout); fflush(stdout); } } /* Read from standard in and print on named pipe (in). */ FD_SET(0, &rfds0); if(select(0+1, &rfds0, NULL, NULL, &tv) > 0){ nout = read(0, bufin, MAXBUF); bufin[nout] = 0; dprintf(fdin, "%s", bufin); fflush(stdout); } } }