一、IO多路复用
IO多路复用就是IO被阻塞状态下,做其他事情
二、select
实现功能:监听;可以监听很多的文件描述符
原型:int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)
fd_set:文件描述符集合,一个容器,可以保存很数据(文件描述符)的数组
maxfd:文件描述符的范围,比待检的最大文件描述符大1
readfds:被读监控的文件描述符集
writefds:被写监控的文件描述符集
exceptfds:被异常监控的文件描述符集
timeval:系统定义时间
返回值,成功返回变化的个数、失败返回-1
一般用来监听读
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> int main(int argc, char const *argv[]) { struct timeval time; fd_set r_set; fd_set all_set; time.tv_sec = 3; time.tv_usec = 0; int fd; if((fd = open("/dev/input/mouse0", O_RDWR | O_CREAT, 0655)) < 0) { perror("open file error!"); exit(1); } FD_SET(fd, &r_set); FD_SET(0, &r_set); all_set = r_set; //暂存如all_set while (1) { r_set = all_set; //每次都进行置位,不然之后每次只会监听变化的那个 int ret = select(fd + 1, &r_set, NULL, NULL, NULL ); if (FD_ISSET(fd, &r_set) > 0) { int cor; read(fd, &cor, sizeof(cor)); printf("cor = %d\n", cor); } if (FD_ISSET(0, &r_set) > 0) { char buffer[1024]; read(0, buffer, sizeof(buffer)); printf("buffer = %s\n", buffer); } } return 0; }
附、一些补充
fd_set……
timeval
int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)
(百度解释)
参数一:最大的文件描述符加1。
参数二:用于检查可读性,
参数三:用于检查可写性,
参数四:用于检查带外数据,
参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间,等完直接回来。如果为空将一直等待(NULL)。
timeval结构的定义:
struct timeval { long tv_sec; // seconds秒 long tv_usec; // microseconds毫秒 }