According to the read man page (2), it only returns zero when EOF is reached.
However, this seems to be wrong and can sometimes return zero, perhaps because the file is not yet ready for reading? Should I call select () to make sure it is ready before reading a file from disk?
Please note that nBytes: 1,445,888
Code example:
fd_set readFdSet; timeval timeOutTv; timeOutTv.tv_sec = 0; timeOutTv.tv_usec = 0; // Let 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; } }
The output is output (when it does not work without reading data):
available: 1445888 availableIn: 0 bufferSize: 1445888 got: 0
This runs on centos4 32 bit as a virtual machine using VMware Server 1.0.10. The read file system is a local virtual machine. The host machine is a 32-bit Windows Server.
Uname -a says:
Linux q-centos4x32 2.6.9-89.0.25.ELsmp
I noticed that the link http://opengroup.org/onlinepubs/007908775/xsh/read.html is below:
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.
So, maybe I get a signal that interrupts reading, and therefore the return value is zero due to an error, or is it considered that zero bytes were read?