Как определить, seekable ли дескриптор файла?

Есть ли какой-либо портативный путь (в системах POSIX), чтобы определить, seekable ли дескриптор файла? Моя мысль состоит в том, чтобы использовать lseek(fd, 0, SEEK_CUR); и проверьте, ли возвращаемое значение-1, но я не уверен, могло ли это дать ложные отрицательные стороны или ложные положительные стороны. Используя fstat и создание предположений о том, какие типы файлов являются seekable/nonseekable, не походит на хорошую идею. Какие-либо другие идеи?

11
задан R.. 13 July 2010 в 15:36
поделиться

2 ответа

Метод lseek кажется разумным. Это, конечно, не может вызвать ложноотрицательный результат - если это так, то с реализацией что-то серьезно не так. Кроме того, согласно спецификации POSIX , предполагается, что дескриптор является каналом, FIFO или сокетом, поэтому теоретически у вас также не должно быть ложных срабатываний. Остается только вопрос, насколько разные системы соответствуют спецификациям. Однако похоже, что любые другие методы, какими бы они ни были, определенно были бы менее переносимыми, чем этот.

10
ответ дан 3 December 2019 в 09:18
поделиться

Вы можете использовать fstat (), а затем макрос S_ISREG в поле режима структуры stat, чтобы проверить, является ли это обычным файлом; обычный файл, по определению , доступен для поиска, тогда как «нерегулярный» (специальный) файл может быть недоступен (я не знаю, есть ли специальные файлы, которые также доступны для поиска).

Но да, проверка возвращаемого значения lseek () и errno == ESPIPE тоже должна работать. В принципе, эффект lseek () на устройствах, которые не могут выполнять поиск, определяется реализацией , поэтому остерегайтесь назальных демонов.

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

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