Si tengo un sistema POSIX como Linux o Mac OS X, ¿cuál es la mejor y más portátil forma de determinar si una ruta está en un sistema de archivos de solo lectura? No puedo pensar en 4 formas de la parte superior de mi cabeza:Mejor forma POSIX para determinar si un sistema de archivos está montado solo lectura
open(2)
un archivo conO_WRONLY
- Usted tendría que llegar a un nombre de archivo único y además debe pasar enO_CREAT
yO_EXCL
. Si falla y tiene un error deEROFS
, entonces sabrá que es un sistema de archivos de solo lectura. Esto tendría el molesto efecto secundario de crear realmente un archivo que no le interesaba, pero podríaunlink(2)
inmediatamente después de crearlo.statvfs(3)
- Uno de los campos de lastruct statvfs
devuelto esf_flag
, y una de las banderas esST_RDONLY
para un sistema de archivos de sólo lectura. Sin embargo, la especificación parastatvfs(3)
deja en claro que las aplicaciones no pueden depender de ninguno de los campos que contienen información válida. Parece que hay una posibilidad decente de queST_RDONLY
no esté configurado para un sistema de archivos de solo lectura.access(2)
- Si conoce el punto de montaje, puede utilizaraccess(2)
con la banderaW_OK
siempre y cuando se está ejecutando como un usuario que tendría acceso de escritura al punto de montaje. Es decir, o usted es root o está montado con su UID como parámetro de montaje. Obtendría un valor de retorno de -1 y un error deEROFS
.Análisis
/etc/mtab
o/proc/mounts
- No parece portátil. Mac OS X parece no tener ninguno de estos, por ejemplo. Incluso si el sistema tenía/etc/mtab
, no estoy seguro de que los campos sean consistentes entre sistemas operativos o si las opciones de montaje para solo lectura (ro
en Linux) son portátiles.
¿Hay otras formas en las que me estoy perdiendo? Si necesitabas saber si un sistema de archivos se montó como de solo lectura, ¿cómo lo harías?
En el mtab uno, si un sistema de archivos está montado en rw pero va ro después, mtab no se actualizará./proc/mounts se actualizará correctamente. – Ryaner