c – 读取(2)不在EOF时返回零?

c – 读取(2)不在EOF时返回零?,第1张

概述根据read(2)的手册页,它只在达到EOF时返回零. 但是,它似乎是不正确的,它有时可能会返回零,也许是因为文件尚未准备好被读取?在从磁盘读取文件之前,我应该调用select()来查看它是否准备好了吗? 请注意,nBytes是:1,445,888 一些示例代码: fd_set readFdSet;timeval timeOutTv;timeOutTv.tv_sec = 0;timeOut 根据read(2)的手册页,它只在达到EOF时返回零.

但是,它似乎是不正确的,它有时可能会返回零,也许是因为文件尚未准备好被读取?在从磁盘读取文件之前,我应该调用select()来查看它是否准备好了吗?

请注意,nBytes是:1,445,888

一些示例代码:

fd_set readFdSet;timeval timeOutTv;timeOutTv.tv_sec = 0;timeOutTv.tv_usec = 0;// Let's see if we'll block on the read.FD_ZERO(&readFdSet);FD_SET(fd,&readFdSet);int selectReturn = ::select(fd + 1,&readFdSet,NulL,&timeOutTv);if (selectReturn == 0) {  // There is still more to read.  return false; // But return early.} else if (selectReturn < 0) {  clog << "Error: select failure: " << strerror(errno) << endl;  abort();} else {  assert(FD_ISSET(fd,&readFdSet));  try {    const int bufferSizeAvailable = _bufferSize - _availableIn;    if (_availableIn) {      assert(_availableIn <= _bufferSize);      memmove(_buffer,_buffer + bufferSizeAvailable,_availableIn);    }    ssize_t got = ::read(fd,_buffer + _availableIn,bufferSizeAvailable);    clog << " available: " << bufferSizeAvailable << " availableIn: "         << _availableIn << " bufferSize: " << _bufferSize << " got "         << got << endl;    return got == 0;  } catch (Err &err) {    err.append("During load from file.");    throw;  }}

输出读取(失败时没有数据读取):

available: 1445888 availableIn: 0 bufferSize: 1445888 got: 0

这是使用VMware Server 1.0.10作为虚拟机在centos4 32位上运行的.正在读取的文件系统是虚拟机的本地系统.主机是windows Server 2008 32位.

uname -a说:

linux q-centos4x32 2.6.9-89.0.25.ELsmp #1 SMP Thu May 6 12:28:03 EDT 2010 i686 i686 i386 GNU/linux

我注意到下面给出的链接http://opengroup.org/onlinepubs/007908775/xsh/read.html说明:

The value returned may be less than nbyte if the number of bytes left in the file is less than nbyte,if the read() request was interrupted by a signal...If a read() is interrupted by a signal before it reads any data,it will return -1 with errno set to [EINTR].If a read() is interrupted by a signal after it has successfully read some data,it will return the number of bytes read.

所以,也许我得到一个信号中断读取,因此返回的值是零因为一个错误或它认为零字节被读取?

解决方法 经过一些研究,实际上在某些情况下它会返回0,你可能不会认为它是“EOF”.

有关详细信息,请参阅read()的POSIX定义:http://opengroup.org/onlinepubs/007908775/xsh/read.html

一些值得注意的是,如果你要求它读取0个字节 – 仔细检查你是不是意外地将0传递给它 – 并且读取文件“写入”部分的结尾(你实际上可以寻找过去的结尾)如果你在那里写了“扩展”文件的文件,那么直到你这样做,“EOF”仍然在已经写好的部分的末尾).

我最好的猜测是你在某个地方遇到了计时问题.您需要问的一些问题是“这些文件是如何编写的?”并且“当我尝试阅读它们时,我确定它们不是零长度吗?”对于第二个,您可以尝试在读取文件之前对文件运行stat()以查看其当前大小.

总结

以上是内存溢出为你收集整理的c – 读取(2)不在EOF时返回零?全部内容,希望文章能够帮你解决c – 读取(2)不在EOF时返回零?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存