sagarfan 发表于 2015-03-20 00:38

关于select函数的一个小疑问。

#include <stdio.h>
       #include <stdlib.h>
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>

       int
       main(void)
       {
         fd_set rfds;
         struct timeval tv;
         int retval;

         /* Watch stdin (fd 0) to see when it has input. */
         FD_ZERO(&rfds);
         FD_SET(0, &rfds);

         /* Wait up to five seconds. */
         tv.tv_sec = 5;
         tv.tv_usec = 0;

         retval = select(1, &rfds, NULL, NULL, &tv);
         /* Don't rely on the value of tv now! */

         if (retval == -1)
               perror("select()");
         else if (retval)
               printf("Data is available now.\n");
               /* FD_ISSET(0, &rfds) will be true. */
         else
               printf("No data within five seconds.\n");

         exit(EXIT_SUCCESS);
       }
疑惑:
FD_SET(0, &rfds);//这里已经在集合rfds中设置文件描述符'0',
然后调用select之后,通过FD_ISSET(0, &rfds)来检测文件描述符'0'是不是集合rfds中的一个元素,来判断是否发生了I/O操作。
但是‘0’不是已经设置过了吗?不是本来就已经在集合rfds中了吗?
对select的原理不是很清楚。。。

asdf2110 发表于 2015-03-20 09:10

FD_SET(0, &rfds);
是把 文件描述符0(stdin)加入到 select 的监控列表中
当文件描述符 0 有事件发生时(可读可写等等),FD_ISSET 才变成真

回复 1# sagarfan


   

sagarfan 发表于 2015-03-20 12:09

哦哦,原来如此,也就是说FD_SET(0, &rfds)的确在集合rfds中设置文件描述符'0',
但是FD_ISSET(0,rfds)并不是判断文件描述符0是否是集合rfds中的元素(因为文件描述符已经被设置)
而是判断这个文件描述符上是否有I/O 事件发生。回复 2# asdf2110


   
页: [1]
查看完整版本: 关于select函数的一个小疑问。