【发布时间】:2017-02-07 22:02:56
【问题描述】:
首先,一些背景信息为这个问题提供一些动机:我有一个程序在无头 Linux 服务器上运行,并在几个可移动外部硬盘驱动器上读取/写入文件,每个驱动器都使用 ext4 文件系统格式化.偶尔,这些驱动器之一上的文件系统元数据会因任何原因而损坏(尽管有 ext4 日志),这可能会导致 ext4 文件系统驱动器检测到问题并将分区重新挂载为只读,大概是为了防止级联错误损坏开车更远。
好的,很公平;但我现在想做的是在我的程序中添加一个功能,该功能可以检测驱动器何时处于这种重新安装的只读状态,以便它可以主动通知用户他的驱动器有问题。
我的问题是,查询文件系统以确定它是否以只读方式安装的优雅/受支持的方法是什么?
尝试将文件写入文件系统还不够好,因为这可能会由于其他原因而失败,而且如果我不需要,我也不想写入文件系统。
我的程序可以fopen("/proc/mounts", "r") 并解析它生成的文本行(在与我的分区对应的行上查找“rw”标记),如果必须的话,我会这样做,但这个解决方案似乎有点hacky(太像屏幕抓取,如果文本格式发生变化可能会破坏)。
那么,我可以使用一些轻量级/专用的 Linux 系统调用来告诉我给定的文件系统挂载点(例如“/dev/sda1”)当前是否以只读方式挂载? stat() 似乎可以做到这一点,但我不知道怎么做。
【问题讨论】:
-
甚至还有一个 POSIX.1 函数可以做到这一点:
statvfs()orfstatvfs()在所需挂载上的任何文件上。如果.f_flag & ST_RDONLY,则以只读方式挂载。 -
一个愚蠢的解决方案是使用
access() -
旁注:如果您查看
statvfs的手册页 [按照 Nominal Animal 的建议],它会注意到 older 版本的statvfs通过解析/proc/mounts收集了标志——所以你离得不远了。手册页还指出,statvfs现在调用 linux 系统调用statfs来获取此信息。 -
@NominalAnimal 我认为您的评论包含我正在寻找的答案;如果您想将其重新发布为答案,我会标记它。
标签: c linux filesystems stat