问题:
- select是什么?什么是select?
- select?用于解决什么问题?
- select的用法?
- 采用select编程解决问题?
select是什么
- select是一个计算机函数。该函数用于监视文件描述符的变化情况——读写或是异常。
select用于解决什么问题
- 操作系统提供select函数来实现多路复用输入/输出模型
select用法
select可以理解为c++的类。fdset可以理解为一个类的实例。将fdset看成this指针。那就是一个c++的类了。
它有如下成员函数:
void FD_ZERO (fd_set * fdset); // clear all bits in fdset
void FD_SET (int fd,fd_set *fdset); // turn on the bit for fd in fdset
void FD_CLR (int fd,fd_set *fdset); // turn off the bit for fd in fdset
int FD_ISSET(int fd,fd_set *fdset); // is the bit for fd on in fdset
系统函数,监督读文件符集和写文件符集及异常文件符集
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);
FD_ZERO
清楚一个文件描述符集
FD_SET
将一个文件描述符加入文件描述符集中
FD_CLR
将一个文件描述符从文件描述符集中清楚
FD_ISSET
测试该集中的一个给定位是否有变化。检查在select函数返回后,某个描述符是否准备好
select
参数maxfdp,传入时,应该是最大的文件描述符加1。
参数readfds,检测该组文件符集中是否有事件可读。可为NULL。
参数writefds,检测该组文件符集中是否有事件可写。可为NULL。
参数errorfds,检测该组文件符集中是否有异常出现。可为NULL。
参数timeout,如果置为NULL。则select一直阻塞,直到三个文件描述符集中有事件发生。
如果为0,则非阻塞,仅检测描述符集合状态,然后立即返回,不等待三个描述符集是否有事件发生。
如果为非零时间,则等待固定时间后返回。或者有事件发送返回。
代码例子
例子1. 监听输入事件
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>//exit
int main()
{
char buffer[128];
int result, nread;
fd_set inputs, testfds;
struct timeval timeout;
FD_ZERO(&inputs);//用select函数之前先把集合清零
FD_SET(STDIN_FILENO,&inputs);//把要检测的句柄——标准输入(0),加入到集合里。
while(1)
{
testfds = inputs;//无限置零。。。
timeout.tv_sec = 2;
timeout.tv_usec = 500000;//500毫秒
// FD_SETSIZE最大长度的fdset。
result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, &timeout);
switch(result)
{
case 0:
printf("timeout\n");
break;
case -1:
perror("select");
exit(1);
default:
if(FD_ISSET(STDIN_FILENO,&testfds))
{
ioctl(STDIN_FILENO,FIONREAD,&nread);//取得从键盘输入字符的个数,包括回车。
if(nread == 0)
{
printf("keyboard done\n");
exit(0);
}
nread = read(STDIN_FILENO,buffer,nread);
buffer[nread] = 0;
printf("read %d from keyboard: %s\n", nread, buffer);
}
break;
}
}
return 0;
}
网友评论