应用程序中最广泛用到的是 BSD UNIX 中引入的 select()系统调用,其原型如下
int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);
其中 readfds、writefds、exceptfds 分别是被 select()监视的读、写和异常处理的文件描述符集合,numfds 的值是需要检查的号码最高的文件描述符加 1。timeout 参数是
一个指向 struct timeval 类型的指针,它可以使 select()在等待 timeout 时间后若没有文件描述符准备好则返回
timeval 结构体定义
struct timeval { int tv_sec; /* 秒 */ int tv_usec; /* 微妙 */ };
下列操作用来设置、清除、判断文件描述符集合。 FD_ZERO(fd_set *set) 清除一个文件描述符集。 FD_SET(int fd,fd_set *set) 将一个文件描述符加入文件描述符集中。 FD_CLR(int fd,fd_set *set) 将一个文件描述符从文件描述符集中清除。 FD_ISSET(int fd,fd_set *set) 判断文件描述符是否被置位
由于调用select的时候,每个驱动的poll函数接口都会被调用到,实际上执行select的进程被挂到了每个驱动的等待队列上。可以被任何一个驱动唤醒