#include #include #include #include #include #include #include #include int main(int argc, char * argv[]) { fd_set rfds; struct timeval tv; char data[256]; int retval; int fd; struct termios config; if (argc < 2) error(-1, 0, "need a port"); fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd < 0) error(-1, errno, "failed to open %s", argv[1]); if(tcgetattr(fd, &config) < 0) error(-1, errno, "tcgetattr failed"); config.c_cc[VMIN] = 100; config.c_cc[VTIME] = 2; if(tcsetattr(fd, TCSANOW, &config) < 0) error(-1, errno, "tcsetattr failed"); while (1) { FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 1; tv.tv_usec = 0; retval = select(fd+1, &rfds, NULL, NULL, &tv); if (retval == -1) perror("select()"); else if (retval) { int nb; retval = ioctl(fd, TIOCINQ, &nb); if (retval) error(-1, errno, "ioctl(TIOCINQ) failed"); else fprintf(stdout,"nb=%d\n",nb); for (int i=0;i<10;i++) { retval = read(fd, data, 100); if (retval < 0 && errno == EAGAIN) { fprintf(stdout,"read() returned EAGAIN\n"); usleep(100000); continue; } else if (retval >= 0) { retval = fwrite(data,1,retval,stdout); break; } else { error(-1, errno, "%d = read() failed", errno); } } } else printf("No data...\n"); } close(fd); return 0; }