Читайте (2), возврат может обнулить если не в EOF?

Согласно странице справочника для чтения (2), это только возвращает нуль, когда EOF достигнут.

Однако кажется, что это неправильно и что это может иногда возвращать нуль, возможно, потому что файл не готов быть считанным уже? Я должен назвать выбор (), чтобы видеть, готово ли это прежде, чем считать файл из диска?

Обратите внимание, что 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

Это работает на centos4 32 битах как на виртуальной машине с помощью VMware Server 1.0.10. Считанная файловая система локальна для виртуальной машины. Хост-машина является 2008 Windows Server 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. 

Так, возможно, я получаю сигнал, прерывающий чтение, и таким образом возвращенное значение является нулем или из-за ошибки, или это думает, что нулевые байты были считаны?

8
задан WilliamKF 20 June 2010 в 03:09
поделиться

3 ответа

Разобрался! У меня было чтение неинициализированной памяти (UMR), и я неправильно искал конец файла.

1
ответ дан 5 December 2019 в 18:56
поделиться

После некоторых исследований выяснилось, что на самом деле есть некоторые обстоятельства, при которых он возвращает 0, которые вы не считаете "EOF".

Для получения подробной информации смотрите определение POSIX для read(): http://opengroup.org/onlinepubs/007908775/xsh/read.html

Некоторые примечательные из них - если вы попросите его прочитать 0 байт - дважды проверьте, что вы случайно не передаете ему 0 - и чтение после конца "записанной" части файла (на самом деле вы можете искать после конца файла, что "расширяет" файл нулями, если вы пишете туда, но пока вы этого не сделали, "EOF" все еще находится в конце уже записанной части).

Мое лучшее предположение - это то, что вы где-то столкнулись с проблемой синхронизации. Некоторые вопросы, которые вам нужно задать: "Как записываются эти файлы?" и "Уверен ли я, что они не нулевой длины, когда я пытаюсь их прочитать?". Что касается второго вопроса, вы можете попробовать выполнить stat() для файла перед его чтением, чтобы узнать его текущий размер.

5
ответ дан 5 December 2019 в 18:56
поделиться

Единственный другой случай, который я могу придумать, когда read () возвращает 0 - это если вы передаете n байтов как 0; иногда это может произойти, если вы передаете размер чего-то или другого в качестве параметра. Может ли это быть тем, что происходит прямо сейчас?

Если файл не готов к чтению, то должно произойти чтение, возвращающее -1, а для errno устанавливается значение EAGAIN.

3
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: