Se ho un sistema POSIX come Linux o Mac OS X, qual è il modo migliore e più portabile per determinare se un percorso è su un filesystem di sola lettura? Posso pensare di 4 modi fuori dalla parte superiore della mia testa:Miglior modo POSIX per determinare se un filesystem è montato sola lettura
open(2)
un file conO_WRONLY
- Si avrebbe bisogno di venire con un nome di file unico e passare anche inO_CREAT
eO_EXCL
. Se fallisce e hai un errore diEROFS
allora sai che è un filesystem di sola lettura. Questo avrebbe il fastidioso effetto collaterale della creazione di un file che non ti interessava, ma potresti immediatamente creare lounlink(2)
dopo averlo creato.statvfs(3)
- Uno dei campi della tornatastruct statvfs
èf_flag
, e una delle bandierine èST_RDONLY
per un filesystem in sola lettura. Tuttavia, le specifiche perstatvfs(3)
chiariscono che le applicazioni non possono dipendere da nessuno dei campi contenenti informazioni valide. Sembrerebbe che ci sia una possibilità decenteST_RDONLY
potrebbe non essere impostato per un filesystem di sola lettura.access(2)
- Se si conosce il punto di montaggio, è possibile utilizzareaccess(2)
con la bandieraW_OK
fino a quando si esegue come un utente che avrebbero accesso in scrittura al punto di montaggio. Cioè, sei root o è stato montato con il tuo UID come parametro di mount. Otterrai un valore di ritorno di -1 e un errno diEROFS
.Parsing
/etc/mtab
o/proc/mounts
- Non sembra portatile. Mac OS X sembra non avere nessuno di questi, per esempio. Anche se il sistema aveva/etc/mtab
non sono sicuro che i campi siano coerenti tra i sistemi operativi o se le opzioni di montaggio per sola lettura (ro
su Linux) sono portatili.
Ci sono altri modi che mi mancano? Se avessi bisogno di sapere se un filesystem è stato montato in sola lettura, come lo faresti?
Sul server mtab, se un file system è montato rw ma passa in seguito, mtab non si aggiornerà./proc/mounts si aggiornerà correttamente. – Ryaner