#include #include #include #include #include #include #include struct termios tsav; void dump(fd, save) int fd; { struct termios t; int res; res = tcgetattr(fd, &t); if (res < 0) exit(errno); if (save) tsav = t; fprintf(stderr, "fd %d: %x/%d/%d\n", fd, t.c_iflag, t.c_cc[VMIN], t.c_cc[VTIME]); } void setraw(fd) int fd; { struct termios t; int res; res = tcgetattr(fd, &t); if (res < 0) exit(errno); cfmakeraw(&t); t.c_cc[VMIN] = 4; t.c_cc[VTIME] = 1; res = tcsetattr(fd, TCSAFLUSH, &t); if (res < 0) exit(errno); } void restore(fd) int fd; { tcsetattr(fd, TCSAFLUSH, &tsav); } int main() { int in; int flags, res; struct pollfd inp; char buf[100]; in = STDIN_FILENO; flags = fcntl(in, F_GETFL); if (flags == -1) exit(errno); flags |= O_NONBLOCK; res = fcntl(in, F_SETFL, flags); if (res < 0) exit(errno); dump(in, 1); setraw(in); dump(in, 0); inp.fd = in; inp.events = POLLIN; res = poll(&inp, 1, -1); fprintf(stderr, "poll: %d (%s)\n", res, strerror(errno)); res = read(in, buf, sizeof(buf)); fprintf(stderr, "read: %d (%s)\n", res, strerror(errno)); restore(in); exit(0); }