什么是I/O复用?
什么是I/O复用(I/O multiplexing)呢?具体点就是当你编写的程序需要同时处理多个描数字(socket或file或device),你又不知道什么时候应该(比方说有数据可以读了)去操作(读/写)哪个描数字。这时候I/O复用就需要登场了。
I/O复用是一种让进程预先“警告”内核能力,使得内核一旦发现进程预先告知时指定的一个或多个I/O条件(就是描述符)就绪(可以读/写了),内核就通知进程。linux有3个调用可实现I/O复用:select、poll,epoll。
select
select()系统调用提供了一种实现同步 I/O 多路复用的机制:
函数头文件: #include <sys/select.h>
函数原型:
int select (int nfds, fd_set *readfds,fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);
- nfds:监听的最大的文件描述符的值+1
readfds 用来检查可读性的一组文件描述字。 writefds 用来检查可写性的一组文件描述字。 exceptfds 用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)
- select函数中需要用到三个fd_set形参,这个结构体到底做什么用的呢
/* The fd_set member is required to be an array of longs. */
typedef long int __fd_mask;
/* Some versions of <linux/posix_types.h> define this macros. */
#undef __NFDBITS
/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */
#define __NFDBITS (8 * (int) sizeof (__fd_mask)) //32
#