Мое приложение использует lseek()
для поиска желаемой позиции для записи данных. Файл успешно открыт с использованием open()
, и мое приложение смогло использовать lseek()
и write()
много раз.lseek/write вдруг возвращает -1 с errno = 9 (Bad file descriptor)
В данный момент для некоторых пользователей и нелегко воспроизводится lseek()
возвращает -1 с errno
из 9. Файл не закрывается до этого, и дескриптор файла (int) не сбрасывается.
После этого создается другой файл; open()
снова в порядке, и lseek()
и write()
снова работает.
Чтобы сделать это еще хуже, этот пользователь снова попробовал полную последовательность, и все было хорошо.
Итак, мой вопрос: может ли ОС закрыть файл для меня по какой-то причине? Что может быть причиной этого? Файл индексатор или сканер файлов?
Каков наилучший способ решить эту проблему? является ли этот псевдокод лучшим решением? (не говоря уже о раскладке коды, будет создавать функции для него)
int fd=open(...);
if (fd>-1) {
long result = lseek(fd,....);
if (result == -1 && errno==9) {
close(fd..); //make sure we try to close nicely
fd=open(...);
result = lseek(fd,....);
}
}
опыта кто-нибудь с чем-то подобным?
Реферат: Файл ищет и пишет работает нормально для данного fd и внезапно возвращает errno = 9 без причины.
Мой код не будет компилироваться, если я попытаюсь открыть (...); Странный. –
Вы знаете псевдокод правильно? –
Если lseek() терпит неудачу с EBADF, вы можете быть уверены, что close() в том же файловом дескрипторе также завершится с EBADF. И поскольку вы не проверяете свои повторные открытия или повторные вызовы, все может произойти. –