[英]Is there a Linux C API call to query a mounted filesystem to see if it is read-only?
[英]Best POSIX way to determine if a filesystem is mounted read only
如果我有像Linux或Mac OS X这样的POSIX系统,那么确定路径是否在只读文件系统上的最佳和最便携的方法是什么? 我可以想到4个方面:
使用O_WRONLY
open(2)
文件 - 您需要提供唯一的文件名并传入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
)的挂载选项是否可移植。
我还有其他方法吗? 如果你需要知道文件系统是否以只读方式挂载,你会怎么做?
utime(path, NULL);
如果你有写权限,那么这将给你ROFS或 - 如果允许 - 只需更新目录上的mtime,这基本上是无害的。
您也可以popen
的命令mount
和检查输出寻找你的文件系统,看它是否持有文本" (ro,"
。
但同样,这不一定是便携式的。
我的选择是不要担心文件系统是否只读安装。 只需尝试创建您的文件,如果失败,告诉用户错误是什么。 当然,让他们选择将其保存在其他地方。
无论如何,你真的必须这样做,因为在测试和执行之间甚至存在小差距的任何情况下,你可能会发现情况发生了变化(可能没有达到使整个文件系统只读的程度但是,谁知道,也许存在(或将来)文件系统允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.