Theo trang người đàn ông để đọc (2), nó chỉ trả về 0 khi đạt đến EOF.Có thể đọc (2) trả về số không khi không ở EOF?
Tuy nhiên, Có vẻ như điều này không chính xác và đôi khi có thể trả lại bằng không, có lẽ vì tệp chưa sẵn sàng để đọc? Tôi có nên gọi select() để xem nó có sẵn sàng trước khi đọc một tập tin từ đĩa không?
Lưu ý rằng nbytes là: 1.445.888
Một số mẫu mã:
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;
}
}
Sản lượng đọc (khi nó không thành công với không có dữ liệu đọc):
available: 1445888 availableIn: 0 bufferSize: 1445888 got: 0
này đang chạy trên centos4 32 bit như một máy ảo sử dụng VMware Server 1.0.10. Hệ thống tệp được đọc là cục bộ cho máy ảo. Máy chủ là Windows Server 2008 32 bit.
Các -a uname nói:
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
tôi nhận thấy rằng các liên kết http://opengroup.org/onlinepubs/007908775/xsh/read.html đưa ra dưới đây trạng thái:
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.
Vì vậy, có lẽ tôi đang nhận được một tín hiệu gián đoạn đọc và do đó giá trị trả về là số không vì một lỗi hoặc nó nghĩ rằng không byte được đọc?
Tôi không thể nghĩ tại sao nó sẽ trả về 0 khi không ở EOF. Bạn có thể cung cấp một ví dụ cụ thể về thời điểm điều này xảy ra không? –
Nó xảy ra trong khoảng một trong 50.000 cố gắng giống nhau. – WilliamKF
Không cần chọn() trên bộ mô tả tập tin. (Tại sao địa ngục trong thiên niên kỷ thứ 3 bạn vẫn sử dụng select() chứ không phải poll() ??) Các tập tin luôn có thể đọc được - chúng không phải là ổ cắm hoặc thiết bị, chúng không thể chặn.Thêm một chút thông tin về hệ thống - distro, phiên bản hạt nhân, hệ thống tệp được sử dụng - có thể hữu ích. – Dummy00001