Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

调用read函数之前请给errno复位(linux)

在linux中调用read,如果你要查询errno来判断错误的时候一定要注意了,这个API有时不会改变errno,那么有可能它是上次的值,而根据它判断就是错误的。
因此一定要记得reset它(errno=0),然后再调用read。这个时候如果errno为0,说明没有被设置。

任何有效的errno都应该是大于0的。

posted on 2011-12-05 10:18 笨笨 阅读(2645) 评论(10)  编辑 收藏 引用 所属分类: NetworkLinux

评论

# re: 调用read函数之前请给errno复位(linux) 2011-12-05 18:25 陈梓瀚(vczh)

好悲惨的设计。  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-05 20:00 冷锋

一般是发生错误才需要检查errno的吧,发生错误了errno就被修改了,具体看man手册,为啥会要在errno没有被改也即没有发生错误的情况下检查errno呢?  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-05 22:51 笨笨

@冷锋
举个例子吧!
TCP发送FIN包的时候会有时间IN事件过来,这个时候去Read,返回是0,也就是什么也没有读到。这种情况下是不会有错误发生的,但怎么样区分是连接关闭还是数据没有呢,你就不得不使用errno了。。。说到这里我想你应该明白了。。。  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 09:23 Onway

在reset errno之前还应该为errno保存一个副本吧?  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 09:53 笨笨

@Onway
这个可能是要注意的,有的情况下,上一次的errno是需要被检查的。  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 11:09 冷锋

man recv显示返回值是-1或者>=0的数,只有=-1才是错误发生,只有错误发生了errno才会被修改才是有效的吧,你在=0的时候取errno去判断是有问题的,对方发fin包过来,我方会收到可读通知,然后recv就会收到0,就说明对方关闭连接了啊@笨笨
  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 13:53 笨笨

@冷锋
如果你循环接收数据,知道一个错误发生,因为你的BUFFER有限,所以你最后一次read到的结果是0,这个时候errno不是为0.
FIN的时候read结果是0,这个时候errno是0.
不使用errno,请问还有什么好办法?  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 18:09 冷锋

文档里面是这么写的:the return value will be 0 when the peer has performed an orderly shutdown.难道还有其他情况recv会返回0的吗?除非文档有问题。如果你是用的阻塞式的socket,buffer有限,会一直被阻塞,如果是非阻塞的话,那么肯定会返回<0吧,然后检查errno==EAGAIN,说明缓冲器已经没有东西可读了@笨笨
  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux) 2011-12-06 22:40 笨笨

我用的是read,另外文档只是文档。。。  回复  更多评论   

# re: 调用read函数之前请给errno复位(linux)[未登录] 2011-12-09 22:43 me

这类破文章都能等上首页,真是堕落。  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理