根据 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, 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 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.
那么,也许我收到一个中断读取的信号,因此返回的值为零,因为要么是错误,要么是它认为读取了零字节?