确定文件系统是否安装的最佳POSIX方法是只读的

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

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

  • statvfs(3) – 返回的struct statvfs一个字段是f_flag ,其中一个标志是ST_RDONLY用于只读文件系统。 但是, statvfs(3)的规范清楚地表明,应用程序不能依赖于包含有效信息的任何字段。 看来ST_RDONLY可能不会被设置为只读文件系统。

  • access(2) – 如果知道挂载点,则只要您以具有对挂载点的写入访问权限的用户身份运行,就可以使用具有W_OK标志的access(2) 。 也就是说,你是root用户,或者是以你的UID作为挂载参数安装的。 你将得到-1的返回值和EROFS的errno。

  • parsing/etc/mtab/proc/mounts – 似乎不便携。 例如,Mac OS X似乎没有这些。 即使系统确实有/etc/mtab我也不确定这些字段在操作系统之间是否一致,或者只读(Linux上的ro )挂载选项是否可移植。

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

     utime(path, NULL); 

    如果你有写perms,那么这会给你ROFS或者 – 如果允许的话 – 只需更新目录上的mtime,这基本上是无害的。

    你也可以使用mount命令来查看你的文件系统的输出结果,看看它是否保存了文本" (ro,"

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

    我的选择是不用担心文件系统是否只读。 试着创建你的文件,如果失败,告诉用户错误是什么。 当然,让他们选择把它保存在别的地方。

    无论如何,你真的不得不这样做,因为在任何测试和干预之间甚至有一点差距的情况下,你都可能发现情况发生了变化(可能不是让整个文件系统只读取,而是知道谁知道,也许有(或将来)一个文件系统,允许这个)。