Лучший способ POSIX определить, смонтирована ли файловая система только для чтения

Если у меня есть система POSIX, такая как Linux или Mac OS X, какой лучший и самый переносимый способ определить, является ли путь в файловой системе только для чтения? Я могу придумать 4 выхода из моей головы:

  • открыть (2) файл с O_WRONLY - Вам нужно будет придумать уникальное имя файла, а также передать ] O_CREAT и O_EXCL . Если это не удается и у вас есть ошибка EROFS , значит, вы знаете, что это файловая система только для чтения. Это будет иметь неприятный побочный эффект, поскольку на самом деле создается файл, который вам не нужен, но вы можете удалить ссылку (2) сразу после его создания.

  • statvfs (3) - Одно из полей возвращенной struct statvfs - это f_flag , а один из флагов - ST_RDONLY для файловая система только для чтения. Однако спецификация для statvfs (3) ясно дает понять, что приложения не могут зависеть ни от одного из полей, содержащих действительную информацию. Казалось бы, есть приличная вероятность, что ST_RDONLY не может быть установлен для файловой системы только для чтения.

  • доступ (2) - Если вы знаете точку монтирования, вы можете использовать доступ (2) с флагом W_OK , пока вы работаете как пользователь, у которого есть доступ на запись к точке монтирования. То есть либо вы являетесь пользователем root, либо он был смонтирован с вашим UID в качестве параметра монтирования. Вы получите возвращаемое значение -1 и ошибку EROFS .

  • Анализ / etc / mtab или / proc / mounts - Нет кажутся портативными. Например, Mac OS X не имеет ни того, ни другого. Даже если бы в системе был / etc / mtab , я не уверен, что поля согласованы между ОС, или если параметры монтирования только для чтения ( ro в Linux) переносимы.

Есть другие способы, которыми я упускаю? Если вам нужно узнать, смонтирована ли файловая система только для чтения, как бы вы это сделали?

6
задан Joe Shaw 4 February 2011 в 14:52
поделиться