免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: PHizing
打印 上一主题 下一主题

[C] select超时设置 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-19 14:59 |只看该作者
原帖由 flw 于 2008-8-19 14:26 发表

楼上是版上某大牛开发的智能回帖机器人,
它的发言你就忽略吧!

不是吧,呵呵~~~智能回帖机器人?

我是说6楼超时设为0立即返回,那个堵塞状态就会变为0,不会恢复NULL

[ 本帖最后由 qliu00 于 2008-8-19 15:01 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2008-08-19 16:22 |只看该作者
还有其它意见没?

论坛徽章:
0
13 [报告]
发表于 2008-08-19 17:04 |只看该作者

回复 #12 PHizing 的帖子

这节是说non-block I/O,不是说 non-block select。目标不是select那不阻塞(整个程序就是读写,没数据来不等待还能干吗?),而是及时(不阻塞)地读写东西。所以socket和std in/out 都是non-block的。


  1. 10     val = Fcntl(sockfd, F_GETFL, 0);
  2. 11     Fcntl(sockfd, F_SETFL, val | O_NONBLOCK);

  3. 12     val = Fcntl(STDIN_FILENO, F_GETFL, 0);
  4. 13     Fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);

  5. 14     val = Fcntl(STDOUT_FILENO, F_GETFL, 0);
  6. 15     Fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);
复制代码



其实作者已经把意思讲得很清楚了
For example, if a line is available on standard input, we read it with read and then send it to the server with writen. But the call to writen can block if the socket send buffer is full. While we are blocked in the call to writen, data could be available for reading from the socket receive buffer.

论坛徽章:
0
14 [报告]
发表于 2008-08-19 21:22 |只看该作者
那照楼上的意思,如何实现select+非阻塞的I/O方式的处理呢?

论坛徽章:
0
15 [报告]
发表于 2008-08-20 09:44 |只看该作者

回复 #14 PHizing 的帖子

那照楼上的意思,APUE上这一节讲得还不够详细么?

[ 本帖最后由 lgfang 于 2008-8-20 09:46 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-08-20 15:38 |只看该作者

回复 #1 PHizing 的帖子

1、select的时间设置为多少和你代码逻辑有关系吧,你设置为 NULL 那代码就一直卡在select这,如果你设置为1秒,那等待1秒没有数据,也会继续执行下面的代码(比如你的一些检查机制或信号检查)。
2、阻塞和非阻塞 对select 不适合吧,select应该是状态触发。有端口状态修改,就会触发,这是select对端口状态判断的机制,而不是内核对端口阻塞非阻塞的判断。
3、借用: 比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."

论坛徽章:
0
17 [报告]
发表于 2008-08-20 22:22 |只看该作者
非阻塞IO,IO多路复用(select and poll)是不同的IO模型
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP