对于多个I/O的读写,调用select函数,可以使程序阻塞于select调用,而不是阻塞在真正的I/O系统调用上,可实现对多个I/O 的操作。
#include
#include
int select (int maxfdp1,fd_set *readset,fd_set *writeset,fd_set * exceptset,const struct timeval *timeout);
timeval结构用于指定这段时间的秒数和微秒数。
struct timeval{
long tv_sec ;
long tv_usec;
};
当参数设置为空指针时,select将永远等待直到一个描述字准备好I/O返回。当参数为固定时间,则在有一个描述字准备好时返回,但不能超过该参数所指定的时间范围。当参数为0使,则根本不等待。
注意1,对于以上前两种情形等待通常时慢系统调用,有可能在此期间被进程捕获的信号中断(sigaction),并从信号处理函数返回。而对于源自Berkeley的内核绝不自动重启被中断的select,SVR4可以自动重启中断的select,条件是在安装信号处理函数是指定了SA_RESTART标志。所以,如果我们在程序中有捕获信号,那么必须处理select返回EINTR错误的可能。
注意2由于不同的系统对于timeval结构体在函数返回后的值处理不同,所以从移植性考虑,我们应该假设该timeval结构在select返回时未被定义,因而每次调用select之前都对它进行重新初始化。
注意3 Select函数用描述字集,典型的是一个整数数组,其中每个整数中的每一位对应一个描述字。调用时利用FD_SET设置描述字集。在select返回后,我们描述字中任何与未就绪的描述字对应的位返回时将清为0。为此,每次调用select函数时,都要再次将所有描述字集中所关心的位均重置为1。
maxfdp1参数指定待测试的描述字个数,它的值是待测试的最大描述字加1。
阅读(1144) | 评论(0) | 转发(0) |