首页 > 代码库 > Linux 套接字编程 - select
Linux 套接字编程 - select
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 256void 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("\nselect begin\n"); sres = select(0 + 1, &rfds, NULL, NULL, NULL); printf("\nselect return\n"); if (sres < 0) { perror("select error"); break; } else if (sres == 0) { /* should not be here for blocked select without timeout*/ printf("select timeout\n"); } else { if (FD_ISSET(0, &rfds)) { nread = read(0, buffer, sizeof(buffer)-1); if (nread <= 0) { perror("read error"); break; } buffer[nread] = ‘\0‘; printf("read string(%d): %s\n", nread, buffer); } } } reset_terminal(&old_args); return 0;}void setup_terminal(struct termios* old_args) { tcgetattr(0, old_args); struct termios new_args = *old_args; new_args.c_lflag &= ~ICANON; new_args.c_cc[VMIN] = 1; tcsetattr(0, TCSANOW, &new_args);}void reset_terminal(struct termios* old_args) { tcsetattr(0, TCSANOW, old_args);}
记得很早之前也一致想实现这个功能,终于如愿,虽然和socket编程没什么太大关系。
参考:
http://tieba.baidu.com/p/685575698
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。