select 可以感知文件表述符集合中的变化,如果办fd0(即标准输入)放入select的read fd set,发现只有按回车的时候select才会返回。查了下要把终端的缓冲大小设为1,这样就能实现击键后马上反应了。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <termio.h> #include <sys/time.h> #include <sys/types.h> #define BUF_SIZE 256 void setup_terminal(struct termios* old_args); void reset_terminal(struct termios* old_args); int main() { struct termios old_args; setup_terminal(&old_args); fd_set rfds; int sres = 0; char buffer[BUF_SIZE]; int nread = 0; for (;;) { /* reset read file descriptor set */ FD_ZERO(&rfds); /* add standard input file descriptor to the set */ FD_SET(0, &rfds); /* do blocking select */ printf(" select begin "); sres = select(0 + 1, &rfds, NULL, NULL, NULL); printf(" select return "); if (sres < 0) { perror("select error"); break; } else if (sres == 0) { /* should not be here for blocked select without timeout*/ printf("select timeout "); } else { if (FD_ISSET(0, &rfds)) { nread = read(0, buffer, sizeof(buffer)-1); if (nread <= 0) { perror("read error"); break; } buffer[nread] = '