Подтвердить что ты не робот

Как определить, доступен ли файловый дескриптор?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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