免费注册 查看新帖 |

Chinaunix

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

标准输入描述符是0,造成select识别异常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-19 15:57 |只看该作者 |倒序浏览
写了一个select的测试程序,以标准输入作为测试,出现了一个问题。
在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds.
敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告知标准输入有数据。
这个问题是否是由于标准输入,描述符是0造成的呢?

一下程序可以运行。

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


int main(int argc, char *argv[])
{
        struct timeval tv;
        fd_set readfds;
        int select_rtn;
        tv.tv_sec = 2;
        tv.tv_usec = 500000;
        FD_ZERO(&readfds);
        //   将所有的文件描述符加入
        FD_SET(0, &readfds);
        /* don't care about writefds and exceptfds: */
        while(1)
        {
                tv.tv_sec = 2;
                tv.tv_usec = 500000;
                FD_ZERO(&readfds);
                FD_SET(0, &readfds);
                select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
                //sleep(1);
                printf("select_rtn %d\n", select_rtn);
                if (select_rtn == -1)
                {
                        printf("将退出,select出错! %s", strerror(errno));
                        break;
                } else if (select_rtn == 0)
                {
                        printf ("没有任何消息到来,用户也没有按键,继续等待……\n");
                        continue;
                }
                else
                {
                        if (FD_ISSET(0, &readfds))
                                printf("A key was pressed!\n");
                        else
                                printf("Timed out.\n");
                }
                sleep(1);
        }
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-01-19 16:17 |只看该作者
if (FD_ISSET(0, &readfds))
                                printf("A key was pressed!\n");

改成
if (FD_ISSET(0, &readfds))
  {
                                read(0, &ch ,1);
                                printf("A key was pressed!\n");
  }
要把那个回车给读取了。 不然一直在缓存中。

论坛徽章:
0
3 [报告]
发表于 2009-01-19 16:32 |只看该作者
多谢LZ指点,原来 select是通过对缓冲区的读取判断有无数据,然后通知应用程序的。

论坛徽章:
0
4 [报告]
发表于 2009-01-19 16:33 |只看该作者
原帖由 againyuan 于 2009-1-19 16:32 发表
多谢LZ指点,原来 select是通过对缓冲区的读取判断有无数据,然后通知应用程序的。


嗯。是的,用这种方式就可以监听多个描述符。如果是read的话,就只能监听一个描述符。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP