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

关于Select模型的一个问题

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

    本文导语:  我用Select模型同时读取键盘和Socket的数据代码如下: FD_ZERO(&rdfds); FD_SET(fileno(stdin), &rdfds); FD_SET(ha_ltm_module_data->sock_fd, &rdfds); tv.tv_sec = 10; tv.tv_usec = 500;  maxfd = fileno(stdin) > ha_ltm_module_data->sock_fd ? fileno(std...

我用Select模型同时读取键盘和Socket的数据代码如下:
FD_ZERO(&rdfds);
FD_SET(fileno(stdin), &rdfds);
FD_SET(ha_ltm_module_data->sock_fd, &rdfds);
tv.tv_sec = 10;
tv.tv_usec = 500; 
maxfd = fileno(stdin) > ha_ltm_module_data->sock_fd ? fileno(stdin)+1 : ha_ltm_module_data->sock_fd+1;
ret = select(ha_ltm_module_data->sock_fd, &rdfds, NULL, NULL, &tv);
if (ret sock_fd, &rdfds))
{
/*处理Socket数据*/
}/* end of  switch  */
}
if(FD_ISSET(fileno(stdin), &rdfds))
{
TRACE("stdin is set",HA_BRIEF_TRACE);
memset(kb_input,0,HA_MAX_COMMAND_STR_SIZE);
fgets(kb_input,HA_MAX_COMMAND_STR_SIZE,stdin);
if (strcmp(kb_input,"quitn")== 0) exit(0);
TRACE("fgets is over",HA_BRIEF_TRACE);
                                ..................
}
}


同时,我定义了一个对CTRL C的处理:当输入CTRL C时,进行特殊的处理,但是并不关闭程序。

但是我发现,当输入CTRL C时,我定义的对Ctrl C的处理执行很正常没有问题。

但是,上面的代码出现了问题,Select模型检查到用户有键盘数据,就去调用fgets,但是fgets由于读取不到数据,就阻塞在了那里。

怎么做可以防止程序阻塞在fgets函数上呢?
谢谢!

|
select调用会被信号中断,此时调用返回-1,errno 为EINTR, 另外你select一次以后需要重新设置FD_ZERO, FD_SET,

你的程序,被信号中断后,也会走到fgets分支,肯定阻塞在那啦

|
说白了,楼主你的代码只能跑一次。之后就会一直阻塞在fgets。
因为你的select没有重新设置FD_ZERO, FD_SET。
建议你用while循环配合FD_ZERO等操作。

|
但是如果楼主的代码能够跑一次的话,那第一次从键盘输入数据也是可以得到一个值的啊,楼主最后发现是什么原因啊》?

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












  • 相关文章推荐
  • java命名空间javax.swing.text.html类html.tag的类成员方法: select定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.sound.midi类shortmessage的类成员方法: song_select定义及介绍
  • man select 结果返回 No manual entry for select
  • java命名空间java.awt类event的类成员方法: list_select定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间java.awt类list的类成员方法: select定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间java.nio.channels类selector的类成员方法: select定义及介绍
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • java命名空间java.awt类choice的类成员方法: select定义及介绍
  • JDBC里select sum和select返回的字段类型不一样
  • java命名空间java.net类proxyselector的类成员方法: select定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.text类jtextcomponent的类成员方法: select定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间java.awt类textcomponent的类成员方法: select定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • HTML中的<select>标签如何设置默认选中的选项
  • INSERT INTO SELECT语句与SELECT INTO FROM语句的一些区别
  • sqlserver iis7站长之家
  • select into 和 insert into select 两种表复制语句


  • 站内导航:


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

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

    浙ICP备11055608号-3