免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1171 | 回复: 2
打印 上一主题 下一主题

[Linux] 关于select函数的一个小疑问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-20 00:38 |只看该作者 |倒序浏览
  1.   #include <stdio.h>
  2.        #include <stdlib.h>
  3.        #include <sys/time.h>
  4.        #include <sys/types.h>
  5.        #include <unistd.h>

  6.        int
  7.        main(void)
  8.        {
  9.            fd_set rfds;
  10.            struct timeval tv;
  11.            int retval;

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

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

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

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

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

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
2 [报告]
发表于 2015-03-20 09:10 |只看该作者
FD_SET(0, &rfds);
是把 文件描述符0(stdin)加入到 select 的监控列表中
当文件描述符 0 有事件发生时(可读可写等等),FD_ISSET 才变成真

回复 1# sagarfan


   

论坛徽章:
0
3 [报告]
发表于 2015-03-20 12:09 |只看该作者
哦哦,原来如此,也就是说FD_SET(0, &rfds)的确在集合rfds中设置文件描述符'0',
但是FD_ISSET(0,rfds)并不是判断文件描述符0是否是集合rfds中的元素(因为文件描述符已经被设置)
而是判断这个文件描述符上是否有I/O 事件发生。回复 2# asdf2110


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP