2010-07-13 2 views
10

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

ответ

10

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

2

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

Но да, проверяя возвращаемое значение lseek() и errno == ESPIPE также должно работать. В принципе, the effect of lseek() on devices which are incapable of seeking is implementation-defined, так что будьте осторожны с носовыми демонами.

+3

Блочные устройства, такие как жесткие диски, могут быть доступны для поиска. Возможно, даже устройства с символами, но я не уверен. – Thomas

+1

некоторые устройства, которые на самом деле не доступны для поиска, не подведут поиск (на лизинге Linux кто-то попытался сделать поиск неудачным, но открыл приложения для пользователей, зависящие от поведения ...) – Spudd86

+0

True; некоторые драйверы персональных устройств просто игнорируют seek() и молча возвращаются. –

Смежные вопросы