Лучший способ POSIX определить, смонтирована ли файловая система только для чтения - PullRequest
5 голосов
/ 04 февраля 2011

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011
utime(path, NULL);

Если у вас есть права на запись, это даст вам ROFS или - если разрешит - просто обновит mtime в каталоге, что в принципе безвредно.

1 голос
/ 04 февраля 2011

Вы также можете popen команду mount и проверить вывод, ища вашу файловую систему и посмотреть, содержит ли он текст " (ro,".

Но опять же, это не обязательно переносимо.

Мой вариант - не беспокоиться о том, была ли файловая система смонтирована только для чтения.Просто попробуйте создать свой файл и, если он потерпит неудачу, сообщите пользователю, в чем заключалась ошибка.И, конечно же, дайте им возможность сохранить его в другом месте.

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

...