码迷,mamicode.com
首页 > 其他好文 > 详细

17初识select

时间:2018-06-23 01:24:34      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:返回值   lse   timeout   eval   print   多路复用   clr   pes   set   

多路复用 select

同时监控多个文件描述符的输入输出

 

<sys/types.h>

<sys/times.h>

<sys/select.h>

int select(int nfds, fd_set *readfds,  fd_set *writefds,  fd_set *exceptfds, struct timeval *timeout)

FD_ISSET(int fd, fd_set *fdset)      //判断fd是否就绪

FD_SET(int fd,  fd_set *fdset)       //增加fd  到 fdset

FD_CLR(int fd,  fd_set *fdset)       //从fdset中删除 fd

FD_ZERO(fd_set *fdset)               //清空fdset

 

函数解析:

int select(int nfds, fd_set *readfds,  fd_set *writefds,  fd_set *exceptfds, struct timeval *timeout)

nfds:           监控文件描述符的最大值 + 1

readfds:      监控的可读文件描述符集合

writefds:      监控的可写文件描述符集合

exceptfds:   监控的异常文件描述符集合

timeout:       超时时间, NULL 表示一直等待

 

select 阻塞 timeout 时间,时间到后,返回

返回值:返回已准备好的文件个数, 0 表示没有fd准备好,-1 表示出错

 

例子:

void  testSelect()

{

      int fd=0;

      char buf[128];

      fd_set fset;

     

      struct timeval tv;

      tv.tv_usec=0;   

 

      while(1)

      {

           FD_ZERO(&fset);

           FD_SET(STDIN_FILENO,&fset);

           tv.tv_sec=5;

           fprintf(stderr,"input:");

           int nRet=select(fd+1,&fset,NULL,NULL,&tv);

           if(nRet==-1)

           {

                 perror("select error!");        

                 return ;

           }

           else if(nRet==0)

           {

                 printf("\nno input\n");

           }

           else

           {

                 if(FD_ISSET(STDIN_FILENO,&fset))

                 {

                      scanf("%s",buf);

                      printf("your input:%s\n",buf);

                 }

           }

      }

     

}

17初识select

标签:返回值   lse   timeout   eval   print   多路复用   clr   pes   set   

原文地址:https://www.cnblogs.com/gd-luojialin/p/9216006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!