Как определить, является ли файловый дескриптор доступным для поиска? - PullRequest
11 голосов
/ 13 июля 2010

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

Ответы [ 2 ]

10 голосов
/ 13 июля 2010

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

2 голосов
/ 13 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...