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

select使用返回值,一个让我困惑的现象.

    来源: 互联网  发布时间:2016-08-28

    本文导语:  我用slect来判断linux的消息队列的可读情况,但发现slect老是返回=0(超时)而不是返回>0(有可读的文件描述符个数),不解中,有谁帮我理解下,谢谢: 截取代码片段说明: 1.创建消息队列代码:     key = ftok(MSG_FILE,'m');     ...

我用slect来判断linux的消息队列的可读情况,但发现slect老是返回=0(超时)而不是返回>0(有可读的文件描述符个数),不解中,有谁帮我理解下,谢谢:

截取代码片段说明:
1.创建消息队列代码:
    key = ftok(MSG_FILE,'m');        
    if(key == -1){                    //如出错则返回-1
     perror("ftok");
     return 0;    
    }        
    printf( "key = %xn",key);        //打印key
    msgid=msgget(key, IPC_CREAT|0660); //创建消息队列,IPC_CREAT,0600是可读可写
    if(msgid == -1){
     perror("msgget");
     return 0;
    }

2.读取消息队列代码:
  while(1)                                    
  {    
    timesend.tv_sec=1;
    timesend.tv_usec=10*1000;  
    FD_ZERO(&rfds);
    FD_SET(msgid,&rfds);
    se_cnt = select (msgid + 1, &rfds, NULL, NULL, ×end);
    printf("se_cnt = %d n",se_cnt);
 //   if(se_cnt > 0){                 //加上这段就读取不了数据,不明白啊...
if(FD_ISSET(msgid,&rfds)){
    if(msgrcv(msgid, &msg, sizeof(struct mymsg), 1, 0)== -1){   
                 perror("msgrcv");                                
               return 0; 
              }
              printf("Server Receive:%sn", msg.senddat); 
 }
//    }
      FD_CLR (msgid, &rfds);
   }


说明:
se_cnt 这个返回值,不会返回>0的值,在我现在注释掉那段,可以正常读取到数据,但是se_cnt=0这个不是超时的返回值吗????
        为什么不会返回1呢???因为有可读信号不是返回可读的文件描述符个数吗?所以我认为是1,但不知道为什么会是0..

有谁帮我解惑下,谢谢...

|
只要是描述符,select都支持
但是在消息队列id不是文件描述符。

    
 
 

您可能感兴趣的文章:

  • 如何使select调用避免描述符操作的不公平现象
  • pc和开发板上使用select多路复用,不同的现象问题请教。
  • man select 结果返回 No manual entry for select
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • JDBC里select sum和select返回的字段类型不一样
  • 关于select函数返回错误的处理
  • 有关select的返回时间问题
  • 为什么我的select不能返回
  • select没有返回?
  • AIX上用shell处理db2 select的返回值
  • 如何得到一个resultSet的长度,即一条select语句返回了多少符合条件记录
  • AIX 5.3下select超时不返回的问题
  • 用select count(*) from xxx;在SQLPLUS查询返回2,可用rs.getInt(1)返回竟然是0!!!
  • select返回0的原因大致有哪些
  • pro*c 里怎么将select 的返回内容赋值给变量
  • select立刻返回0,errno=0,根本没有等到超时的情况,为何
  • socket通信时,select一直返回超时的问题
  • 非阻塞方式socket中, 去读select返回的sockfd是否一定是非0值??如果读到的字节数比期望少有没有什么好的处理模式??
  • 关于unix网络编程select函数总是返回0的问题
  • 请帮忙看一下,为什么Linux下 select 总返回 0,windows下就正常
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • insert into select和select into的使用和区别介绍
  • Select() 是否只能在非阻塞IO里使用,在阻塞IO里可以使用吗?
  • 在多线程中使用select
  • socket通讯使用select的问题
  • 请问使用SELECT()函数怎么监测串口发送数据?
  • 请教select的使用问题
  • 如何使用select实时监听串口通信?
  • 问Linux下select() 的使用
  • socket的select使用超时的问题
  • pycharm 使用心得(九)解决No Python interpreter selected的问题
  • 关于select()函数的使用问题
  • 使用select 定时的问题
  • insert select与select into 的用法使用说明
  • mysql中insert与select的嵌套使用解决组合字段插入问题
  • mysql中insert与select的嵌套使用方法
  • zf框架的db类select查询器join链表使用示例(zend框架)
  • 解析MySQL中INSERT INTO SELECT的使用
  • 使用Java获取html中Select,radio多选的值方法
  • Php中使用Select 查询语句的实例
  • select客户端的使用
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selected定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selectable定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间javax.swing.tree类defaulttreeselectionmodel的类成员方法: selection定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍


  • 站内导航:


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

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

    浙ICP备11055608号-3