Select系统调用方法

来源:互联网 发布:html5纯静态源码 编辑:程序博客网 时间:2024/05/21 10:31

Select系统调用用于多路监控,当没有一个文件满足要求时,将阻塞调用的进程。


int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct  timeval *timeout)

参数说明:

Maxfd:
文件描述符的范围,比待检测的最大文件描述符大1
Readfds:
被读监控的文件描述符集
Writefds:
被写监控的文件描述符集
Exceptfds:
被异常监控的文件描述符集;
Timeout:
定时器


Timeout取不同的值,该调用有不同的表现:
Timeout值为0,不管是否有文件满足要求,都立刻返
回,无文件满足要求返回0,有文件满足要求返回一个
正值。
Timeout为NULL,select将阻塞进程,直到某个文件
满足要求
Timeout值为正整数,就是等待的最长时间,即
select在timeout时间内阻塞进程。


Select调用返回时,返回值有如下情况:
1.正常情况下返回满足要求的文件描述符个
数;
2.经过了timeout等待后仍无文件满足要求,返
回值为

回值为0;
3.如果select被某个信号中断,它将返回-1并


设置errno为EINTR。
4.如果出错,返回-1并设置相应的errno。

使用步骤如下:

1. 将要监控的文件添加到文件描述符集
2. 调用Select开始监控
3. 判断文件是否发生变化


系统提供了4个宏对描述符集进行操作:
#include <sys/select.h> 
void FD_SET(int fd, fd_set *fdset)
void FD_CLR(int fd, fd_set *fdset)
void FD_ZERO(fd_set *fdset)
void FD_ISSET(int fd, fd_set *fdset)
宏FD_SET将文件描述符fd添加到文件描述符集fdset中;
宏FD_CLR从文件描述符集fdset中清除文件描述符fd;
宏FD_ZERO清空文件描述符集fdset;
在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件
fd发生了变化。

例:

FD_ZERO(&fds); //清空集合
FD_SET(fd1,&fds); //设置描述符
FD_SET(fd2,&fds); //设置描述符
maxfdp=fd1+1; //描述符最大值加1,假设fd1>fd2
switch(select(maxfdp,&fds,NULL,NULL,&timeout)) 
case -1: exit(-1);break; //select错误,退出程序
case 0:break; 
default: 
if(FD_ISSET(fd1,&fds)) //测试fd1是否可读