SelectI/O多路转接模型是处理I/O复用的一个高效方法。
Select函数语法要点
所需头文件:

#include<sys/types.h>
#include<sys/time.h>
#include<unistd.h>
#include <sys/select.h>

函数原型:int select(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exeptfds,struct timeval *timeout)
函数传入值:
numfds:需要检查的号码最高的文件描述符加1
Readfds:由select()监视的读文件描述符集合
Writefds:由select()监视的写文件描述符集合
Exeptfds:由select()监视的异常处理文件描述符集合
Timeout:NULL:永远等待,直到捕捉到信号或文件描述符已准备好为止
具体值:struct timeval类型的指针,若等待为timeout时间还没有文件描述符准备好,就立即返回。
0:从不等待,测试所有指定的描述符并立即返回。
函数返回值:成功:准备好的文件描述符      -1:出错

这里对文件描述符的处理主要涉及到4个宏函数:
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函数之前,首先使用FD_ZERO和FD_SET来初始化文件描述符集,在使用了select函数时,可循环使用FD_ISSET测试描述符集,在执行完成对相关后文件描述符后,使用FD_CLR来清除描述符集。
Select函数中的timeout是一个struct timeval类型的指针,如下:
Struct timeval{
    Long tv_sec:/*second*/
    Long tv_unsec;/*and microseconds(微妙)*/
}

/**/
#include <stdio.h>
#include <unstd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/select.h>


int main(void)
{
    int fds[2];
    char buf[7];
    int rc,maxfd;
    fd_set inset1,inset2;
    struct timeval tv;
    /*首先按一定的权限打开Hello文件*/
    if((fds[0] = open ("hello1", O_RDWR|O_CREAT,0666))<0)
        perror("open hello1");
    /*再按一定权限打开Hello2文件*/
    if((fds[1] = open ("hello2", O_RDWR|O_CREAT,0666))<0)
        perror("open hello2");
    if((rc = write(fds[0],"Hello!\n",7)))
        printf("rc=%d\n",rc);
    lseek(fds[0],0,SEEK_SET);
    /*取出两个文件描述符中的较大者*/
    maxfd = fds[0]>fds[1] ? fds[0] : fds[1];
    /*初始化读集合inset1,并在读集合中加入相应的描述集*/
    FD_ZERO(&inset1);
    FD_SET(fds[0],&inset1);
    /*初始化写集合inset2,并在写集合中加入相应的描述集*/
    FD_ZERO(&inset2);
    FD_SET(fds[1],&inset2);
    tv.tv_sec=2;
    tv.tv_usec=0;
    /*循环测试该文件描述符是否准备就绪,并调用select函数对相关文件描述符做对应操作*/
    while(FD_ISSET(fds[0],&inset1)||FD_ISSET(fds[1],&inset2))
    {
        if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
            perror("select");
        else{
            if(FD_ISSET(fds[0],&inset1))
            {
                rc = read(fds[0],buf,7);
                if(rc>0)
                {
                    buf[rc]='\0';
                    printf("read: %s\n",buf);
                }else
                    perror("read");
            }
            if(FD_ISSET(fds[1],&inset2))
            {
                rc = write(fds[1],buf,7);
                if(rc>0)
                {
                    buf[rc]='\0';
                    printf("rc=%d,write: %s\n",rc,buf);
                }else
                    perror("write");
                sleep(10);
            }
        }
    }
    return 0;
}
12-21 20:19