如果我有一个像Linux或Mac这样的POSIX系统,那么确定路径是否在只读文件系统上的最佳和最可移植的方法是什么?我想出了四种方法:
open(2)是一个带有O_WRONLY的文件--您需要找到一个惟一的文件名,并且还需要传入O_CREAT和O_EXCL。如果它失败了,并且您有一个EROFS错误,那么您就知道它是一个只读文件系统。这将产生一个恼人的副作用,即实际上创建一个您并不关心的文件,但是您可以在创建it.statvfs(3)之后立即创建它--返回的struct statvfs的一个字段是f_flag,其中一个标志是只读文件系统的ST_RDONLY。但是,statvfs(3)的规范清楚地表明,应用程序不能依赖任何包含有效信息的字段。如果您知道挂载点,那么如果您知道挂载点,您就可以使用filesystem.access(2)标记,只要您是作为对挂载点的写访问权限运行的用户,就可以使用access(2)和W_OK标志。Ie,要么是根用户,要么是以UID作为挂载参数挂载的。返回值为1,而EROFS./etc/mtab或/proc/mounts的errno似乎是不可移植的。例如,Mac似乎两者都没有。即使系统有/etc/mtab,我也不确定OSes之间的字段是否一致,或者只读的挂载选项(Linux上的ro)是否是可移植的。还有其他我错过的方式吗?如果你需要知道一个文件系统是否是只读的,你会怎么做呢?
发布于 2011-02-04 05:18:27
您还可以popen命令mount并检查输出,查找您的文件系统,并查看它是否包含文本" (ro,"。
但同样,这不一定是便携的。
我的选择是,不要担心文件系统是否被挂载,只读。只需尝试创建您的文件,如果它失败,告诉用户错误是什么。当然,让他们选择把它保存在其他地方。
无论如何,您都必须这样做,因为在任何情况下,在测试和执行之间甚至有很小的差距,您可能会发现情况发生了变化(可能不是让整个文件系统只读,但是,谁知道,也许会有(或将来会)一个允许这样做的文件系统)。
发布于 2011-02-04 05:29:26
utime(path, NULL);如果您有写perms,那么这将给您ROFS或者--如果允许的话--只需更新目录上的mtime,这基本上是无害的。
https://stackoverflow.com/questions/4894743
复制相似问题