Есть ли какой-либо переносной способ (в системах POSIX), чтобы определить, доступен ли файловый дескриптор? Моя мысль состоит в том, чтобы использовать lseek(fd, 0, SEEK_CUR);
и проверить, является ли возвращаемое значение равным -1, но я не уверен, что это может дать ложные отрицания или ложные срабатывания. Использование fstat
и предположение о том, какие типы файлов доступны для поиска/несекретного, звучат не очень хорошо. Любые другие идеи?Как определить, доступен ли файловый дескриптор?
ответ
lseek
способ кажется разумным. Это, конечно же, не может вызвать ложный негатив - если это так, что-то серьезно не соответствует реализации. Кроме того, согласно POSIX spec, он должен потерпеть неудачу, если дескриптор представляет собой канал, FIFO или сокет, поэтому теоретически вы также не должны иметь ложных срабатываний. Единственный оставшийся вопрос - насколько хорошо разные системы соответствуют спецификациям. Однако, похоже, какие-либо другие методы, какими бы они ни были, определенно были бы менее переносимыми, чем это.
Вы можете использовать fstat(), а затем макрос S_ISREG в поле режима структуры stat, чтобы проверить, является ли он обычным файлом; обычный файл, per definiton, доступен для поиска, тогда как «нерегулярный» (специальный) файл может не быть (я не знаю, есть ли специальные файлы, которые также доступны для поиска).
Но да, проверяя возвращаемое значение lseek() и errno == ESPIPE также должно работать. В принципе, the effect of lseek() on devices which are incapable of seeking is implementation-defined, так что будьте осторожны с носовыми демонами.
- 1. Android - Как проверить, доступен ли файловый менеджер?
- 2. Unix-файловый дескриптор
- 3. Как узнать файловый дескриптор файла
- 4. Можно ли опросить файловый дескриптор kqueue `select()`?
- 5. Файловый дескриптор Linux из файла
- 6. Процессы и общий файловый дескриптор
- 7. node.js получить файловый дескриптор сокета?
- 8. Файловый дескриптор сокета Java-дейтаграммы
- 9. Перенаправить ввод в файловый дескриптор?
- 10. Открыть файловый дескриптор в C
- 11. Как определить, доступен ли документ?
- 12. Определение того, является ли читаемый файловый дескриптор считанным концом трубы
- 13. Как получить файловый дескриптор буфера в памяти?
- 14. Как сгенерировать файловый дескриптор в случайном лесу?
- 15. Почему закрытие входного потока также закрывает связанный файловый дескриптор, даже файловый дескриптор разделяется между несколькими потоками?
- 16. Нестандартный файловый дескриптор в пакетном скрипте
- 17. Как определить, является ли дескриптор файла сокетом?
- 18. Есть ли способ создать файловый дескриптор в Linux?
- 19. Определить, доступен ли сельдерей/работает
- 20. Нужен файловый дескриптор для сокета в UDP
- 21. Где kevent() проверить его файловый дескриптор?
- 22. Почему open делает мой файловый дескриптор 0?
- 23. Делает ли dup2 больше, чем копировать файловый дескриптор?
- 24. Определить, доступен ли X11 (python)
- 25. Определить, доступен ли Chrome NaCl
- 26. Утилита отключена, используя дополнительный файловый дескриптор?
- 27. Linux Socket файловый дескриптор с потоками
- 28. Невозможно перенаправить файловый дескриптор, хранящийся в переменной
- 29. изменить файловый дескриптор для сокета в python
- 30. Как надежно определить, доступен ли Passbook?
Блочные устройства, такие как жесткие диски, могут быть доступны для поиска. Возможно, даже устройства с символами, но я не уверен. – Thomas
некоторые устройства, которые на самом деле не доступны для поиска, не подведут поиск (на лизинге Linux кто-то попытался сделать поиск неудачным, но открыл приложения для пользователей, зависящие от поведения ...) – Spudd86
True; некоторые драйверы персональных устройств просто игнорируют seek() и молча возвращаются. –