C语言select()函数:I/O多工机制
头文件:#include <sys/time.h> #include <sys/types.h> #include <unistd.h>
定义函数:int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout);
函数说明:select()用来等待文件描述词状态的改变. 参数n 代表最大的文件描述词加1, 参数readfds、writefds 和exceptfds 称为描述词组, 是用来回传该描述词的读, 写或例外的状况. 底下的宏提供了处理这三种描述词组的方式:
FD_CLR(inr fd, fd_set* set); 用来清除描述词组set 中相关fd 的位
FD_ISSET(int fd, fd_set *set); 用来测试描述词组set 中相关fd 的位是否为真
FD_SET(int fd, fd_set*set); 用来设置描述词组set 中相关fd 的位
FD_ZERO(fd_set *set); 用来清除描述词组set 的全部位
参数 timeout 为结构timeval, 用来设置select()的等待时间, 其结构定义如下:
struct timeval
{
time_t tv_sec;
time_t tv_usec;
};
返回值:如果参数timeout 设为NULL 则表示select ()没有timeout.
错误代码:执行成功则返回文件描述词状态已改变的个数, 如果返回0 代表在描述词状态改变前已超过timeout 时间, 当有错误发生时则返回-1, 错误原因存于errno, 此时参数readfds, writefds, exceptfds 和timeout的值变成不可预测。
EBADF 文件描述词为无效的或该文件已关闭
EINTR 此调用被信号所中断
EINVAL 参数n 为负值.
ENOMEM 核心内存不足
范例:
常见的程序片段:fs_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
select(fd+1, &readset, NULL, NULL, NULL);
if(FD_ISSET(fd, readset){...}
定义函数:int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout);
函数说明:select()用来等待文件描述词状态的改变. 参数n 代表最大的文件描述词加1, 参数readfds、writefds 和exceptfds 称为描述词组, 是用来回传该描述词的读, 写或例外的状况. 底下的宏提供了处理这三种描述词组的方式:
FD_CLR(inr fd, fd_set* set); 用来清除描述词组set 中相关fd 的位
FD_ISSET(int fd, fd_set *set); 用来测试描述词组set 中相关fd 的位是否为真
FD_SET(int fd, fd_set*set); 用来设置描述词组set 中相关fd 的位
FD_ZERO(fd_set *set); 用来清除描述词组set 的全部位
参数 timeout 为结构timeval, 用来设置select()的等待时间, 其结构定义如下:
struct timeval
{
time_t tv_sec;
time_t tv_usec;
};
返回值:如果参数timeout 设为NULL 则表示select ()没有timeout.
错误代码:执行成功则返回文件描述词状态已改变的个数, 如果返回0 代表在描述词状态改变前已超过timeout 时间, 当有错误发生时则返回-1, 错误原因存于errno, 此时参数readfds, writefds, exceptfds 和timeout的值变成不可预测。
EBADF 文件描述词为无效的或该文件已关闭
EINTR 此调用被信号所中断
EINVAL 参数n 为负值.
ENOMEM 核心内存不足
范例:
常见的程序片段:fs_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
select(fd+1, &readset, NULL, NULL, NULL);
if(FD_ISSET(fd, readset){...}