【1】IO多路复用
基本思想:
1. 创建一个关于文件描述符的表、集合;
fd_set readfds;
2. 要把你关心的文件描述符加入到表或集合当中;
0 fd=open() sockfd acceptfd
3. 调用具体函数select/poll,来监听具体有哪个或者多个文件描述符产生了事件;
如何有一个或者多个文件描述符产生了事件,那么函数返回;
4. 轮询判断具体是哪个文件描述符产生了事件;
if for()
5. 根据文件描述符来操作逻辑;
select();
把产生事件以外的文件描述符全部置0;
【2】select
NAME
select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O
multiplexing
SYNOPSIS
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int maxfd, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
参数:
maxfd: 我们要监听最大文件描述符+1(文件描述符的个数)
readfds: 读集合
writefds: 写集合
exceptfds: 异常集合
timeout: 超时时间
如果填NULL,返回值: -1 出错
>0 表示有多个事件产生
如果设置timeval 返回值:
-1 出错
=0 时间到了,没有事件产生
>0 一个或多个文件描述符产生了事件
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
struct timeval tv = {
.tv_sec = 1,
.tv_usec = 0,
};
struct timeval tv = {1,0};
需求:想监听数据是从键盘来的,还是从鼠标来的数据;
0 /dev/input/mouse1
大家的鼠标可能不是mouse1,要自己测试一下;
void FD_CLR(int fd, fd_set *set); // 清集合当中的某一位
int FD_ISSET(int fd, fd_set *set); // 判断fd是否在集合当中
void FD_SET(int fd, fd_set *set); // 把fd加入到集合当中
void FD_ZERO(fd_set *set); // 清空集合
需求: 想监听标准输入0,还想监听sockfd;