如果我有像Linux或Mac OS X这样的POSIX系统,那么确定路径是否在只读文件系统上的最佳和最便携的方法是什么?我可以想到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
,我也不确定操作系统之间的字段是否一致,或者只读(Linux上为ro
)的挂载选项是否可移植。
我还有其他方法吗?如果你需要知道文件系统是否以只读方式挂载,你会怎么做?
答案 0 :(得分:2)
utime(path, NULL);
如果你有写权限,那么这将给你ROFS或 - 如果允许 - 只需更新目录上的mtime,这基本上是无害的。
答案 1 :(得分:1)
您还可以popen
命令mount
并检查输出,查找您的文件系统并查看其是否包含文本" (ro,"
。
但同样,这不一定是便携式的。
我的选择是不要担心文件系统是否只读了。只需尝试创建您的文件,如果失败,告诉用户错误是什么。当然,让他们选择将其保存在其他地方。
无论如何,你真的必须这样做,因为在测试和执行之间甚至存在小差距的任何情况下,你可能会发现情况发生了变化(可能不会使整个文件系统只读,但谁知道,也许有(或将来会有)允许这样做的文件系统。