当前位置:  技术问答>linux和unix

标准输入描述符是0,造成select识别异常

    来源: 互联网  发布时间:2016-05-18

    本文导语:  写了一个select的测试程序,以标准输入作为测试,出现了一个问题。 在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds. 敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告...

写了一个select的测试程序,以标准输入作为测试,出现了一个问题。
在运行 select的时候,程序中采用循环设置FD_ZERO,清空readfds.
敲入回车键,FD_ISSET检测到标准输入有数据。但是在下一次循环中不敲入回车还是被告知标准输入有数据。
这个问题是否是由于标准输入,描述符是0造成的呢?

一下程序可以运行。

#include 
#include 
#include 
#include 
#include 
#include 


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 %dn", 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;
}

|
但是在下一次循环中不敲入回车还是被告知标准输入有数据。 

有缓冲区的。

|
 1 #include 
  2 #include 
  3 #include 
  4 #include 
  5 #include 
  6 #include 
  7 int main(int argc, char *argv[])
  8 {
  9         struct timeval tv;
 10         fd_set readfds;
 11         int select_rtn;
 12         char str[50];
 13         tv.tv_sec = 2;
 14         tv.tv_usec = 500000;
 15  
 16         while(1)
 17           {
 18                 tv.tv_sec = 2;
 19                 tv.tv_usec = 500000;
 20                 FD_ZERO(&readfds);
 21                 FD_SET(0, &readfds);
 22                 select_rtn = select(0+1, &readfds, NULL, NULL, NULL);
 23                 printf("select_rtn %dn", select_rtn);
 24                 if (select_rtn == -1)
 25                   {
 26                         printf("将退出,select出错! %s", strerror(errno));
 27                         break;
 28                   } else if (select_rtn == 0)
 29                     {
 30                           printf ("没有任何消息到来,用户也没有按键,继续等待……n");
 31                           continue;
 32                     }
 33                 else
 34                   {
 35                         if (FD_ISSET(0, &readfds)) {
 36                                 printf("A key was pressed!n");
 37                                 read(0,str,50);
 38                                 printf("Your input is :%sn", str);
 39                         }
 40                         else    
 41                                 printf("Timed out.n");
 42                   }
 43                 sleep(1);
 44           }
 45         return 0;
 46 } 

|
smart question.
楼上抢答也忒快,不然我还以为是我的盘中餐.
一时技痒,也写了一个类似writeset.



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFSIZE 4096

int
main(int argc, char **argv)
{
  char buf[BUFSIZE];
  int n, ret, pfd[2];
  pid_t pid;
  fd_set writeset;

  if (pipe(pfd) 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于标准输出的缓冲造成的死锁
  • C++ I/O 成员 sync_with_stdio():同标准I/O同步
  • 有没有这样的软件:把一个不标准格式的JAVA原代码转换为具有标准(或比较标准)编码规范的代码。
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 请问如何将标准输出重定向到标准输入?
  • C++准标准库boost库中文介绍
  • 有关标准输入,标准输出等的弱问!送分
  • 标准c++四种强制类型转换方式介绍
  • 请问能否把JCombobox控件设成标准列表框(window标准风格)
  • C++ STL标准模板库类String成员详细列表参考及示例代码
  • 我用管道作为一个程序的标准输入时,程序报错说不是一个终端不能做为标准输入,请问怎么样管道成为它的标准输入呢???具体错误信息见内
  • HTML 标准颜色值实例代码表
  • 用标准件的方式来组装网页DIV布局-WEB标准网站设计心得
  • 当A,B程序都在不断读入标准输入的时候, 为什么往A标准输入里面输入的数据一定能被A读到,而不是被B读到?
  • 当A,B程序都在不断读入标准输入的时候, 为什么往A标准输入里面输入的数据一定能被A读到,而不是被B读到? iis7站长之家
  • 可移植的C++标准库 Boost
  • 如何在关闭标准输入输出之后重新打开它们
  • linux支持标准问题
  • 标准兼容的 WYSIWYG 编辑器 XStandard
  • 标准C++类库 STDCXX
  • C++标准库实现 libc++
  • 请问文件格式(如.htm,.avi)的标准该怎么找?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3