最好的POSIX方法来确定文件系统是否以只读方式挂载

时间:2011-02-04 05:01:31

标签: linux unix filesystems posix readonly

如果我有像Linux或Mac OS X这样的POSIX系统,那么确定路径是否在只读文件系统上的最佳和最便携的方法是什么?我可以想到4个方法:

  • open(2)包含O_WRONLY的文件 - 您需要提供唯一的文件名,并传入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)的挂载选项是否可移植。

我还有其他方法吗?如果你需要知道文件系统是否以只读方式挂载,你会怎么做?

2 个答案:

答案 0 :(得分:2)

utime(path, NULL);

如果你有写权限,那么这将给你ROFS或 - 如果允许 - 只需更新目录上的mtime,这基本上是无害的。

答案 1 :(得分:1)

您还可以popen命令mount并检查输出,查找您的文件系统并查看其是否包含文本" (ro,"

但同样,这不一定是便携式的。

我的选择是不要担心文件系统是否只读了。只需尝试创建您的文件,如果失败,告诉用户错误是什么。当然,让他们选择将其保存在其他地方。

无论如何,你真的必须这样做,因为在测试和执行之间甚至存在小差距的任何情况下,你可能会发现情况发生了变化(可能不会使整个文件系统只读,但谁知道,也许有(或将来会有)允许这样做的文件系统。