c中select的理解

解决的问题:

传统用法,若一个handle不可读,则阻塞;设想若有一个不可读被阻塞了,这个时候还有一个handle可读呢,这时就要用select来解决

Select的函数格式:

int select(int maxfdp,  fd_set *readfds,  fd_set *writefds,  fd_set *errorfds,  struct timeval*timeout);
对于fd_set类型的操作:(fd_set相当于一个handle数组)

              fd0  fd1  fd2

readfd   0       0     0  ;;;;;; ;

writefd   0      0     0  ;;;;;;;

FD_ZERO(fd_set *),将fd_set所有位都清零

FD_SET(int ,fd_set*),开启fd_set的 一位

FD_CLR(int,fd_set*),清除一位

FD_ISSET(int ,fd_set* )检查集合中指定的handle是否开启


从select返回时,可以用FD_ISSET 来测试fdset中一个给定位是否仍然开启

select的返回值是已经置位的描述符个数,,若一个描述符可以读也可以写,将会记数两次。

 FD_ZERO(&allset);     /* 清空文件描述符集合 */
 FD_SET(lfd, &allset);    /* 将监听接字设置在集合内 */
 /* 开始服务器程序的死循环 */
 while(1){
  printf("hello\n");
  rset = allset;
  ret_n = FD_ISSET(lfd, &rset);   //返回1,因为已经开启
  
  /* 得到当前可以读的文件描述符数 */
  rdy = select(maxfd + 1, &rset, NULL, NULL, NULL);
  if (FD_ISSET(lfd, &rset)){         //rdy表示rset集合中 有几个可以读的hand开启,

//FD_ISSET来测试rset中的lfd是否依然可以读,因为select会重新对集合中的位检测并置位,虽然上边那个FD_ISSET返回1,但是经过了select不一定
   addr_len = sizeof(cin);

;;

;;




你可能感兴趣的:(c中select的理解)