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

Joe*_*haw 6 unix linux filesystems posix readonly

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

  • open(2)一个文件O_WRONLY- 你需要提出一个唯一的文件名,并传入O_CREATO_EXCL.如果它失败并且您有错误,EROFS那么您就知道它是一个只读文件系统.这会产生令人讨厌的副作用,实际上创建一个你不关心的文件,但是你可以unlink(2)在创建它之后立即创建它.

  • statvfs(3)- 返回的字段之一struct statvfsf_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我也不确定操作系统之间的字段是否一致,或者只读(ro在Linux上)的挂载选项是否可移植.

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

pax*_*blo 2

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

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

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

无论如何,你确实必须做这类事情,因为在任何情况下,即使测试和执行之间存在很小的差距,你也可能会发现情况发生变化(可能不会达到使整个文件系统只读的程度,但是,谁知道呢? ,也许有(或将来)有一个文件系统允许这样做)。