簡體   English   中英

最好的POSIX方法來確定文件系統是否以只讀方式掛載

[英]Best POSIX way to determine if a filesystem is mounted read only

如果我有像Linux或Mac OS X這樣的POSIX系統,那么確定路徑是否在只讀文件系統上的最佳和最便攜的方法是什么? 我可以想到4個方面:

  • 使用O_WRONLY open(2)文件 - 您需要提供唯一的文件名並傳入O_CREATO_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我也不確定操作系統之間的字段是否一致,或者只讀(Linux上的ro )的掛載選項是否可移植。

我還有其他方法嗎? 如果你需要知道文件系統是否以只讀方式掛載,你會怎么做?

utime(path, NULL);

如果你有寫權限,那么這將給你ROFS或 - 如果允許 - 只需更新目錄上的mtime,這基本上是無害的。

您也可以popen的命令mount和檢查輸出尋找你的文件系統,看它是否持有文本" (ro,"

但同樣,這不一定是便攜式的。

我的選擇是不要擔心文件系統是否只讀安裝。 只需嘗試創建您的文件,如果失敗,告訴用戶錯誤是什么。 當然,讓他們選擇將其保存在其他地方。

無論如何,你真的必須這樣做,因為在測試和執行之間甚至存在小差距的任何情況下,你可能會發現情況發生了變化(可能沒有達到使整個文件系統只讀的程度但是,誰知道,也許存在(或將來)文件系統允許這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM