是否有Linux C API调用来查询已挂载的文件系统以查看它是否为只读?

时间:2017-02-07 22:02:56

标签: c linux filesystems stat

首先,提供一些背景信息来为这个问题提供一些动力:我有一个在无头Linux服务器上运行的程序,并在几个可移动外部硬盘驱动器上读/写文件,每个硬盘都使用ext4文件系统格式化。偶尔,其中一个驱动器上的文件系统元数据因任何原因(尽管有ext4日志)而损坏,这可能导致ext4文件系统驱动器检测到问题并将分区重新安装为只读,这可能是防止级联错误损坏的预防措施进一步推动。

好的,足够公平;但我现在要做的是为我的程序添加一个函数,该函数可以检测驱动器何时处于这种重新安装的只读状态,以便它可以主动通知用户他的驱动器有问题。 / p>

我的问题是,查询文件系统以查明它是否以只读方式安装的优雅/支持方式是什么?

尝试将文件写入文件系统是不够的,因为这可能由于其他原因而失败,并且因为我不想写文件系统,如果我不需要。

我的程序可以fopen("/proc/mounts", "r")并解析它生成的文本行(对应于我的分区的行上的“rw”标记),如果必须,我会,但是这个解决方案似乎有点hacky(太像屏幕抓取,如果文本格式发生变化,可能会破坏)。

那么,是否有一些我可以使用的轻量级/专用Linux系统调用可以告诉我给定的文件系统挂载点(例如“/ dev / sda1”)当前是否以只读方式挂载?似乎stat()可能会这样做,但我看不出如何。

2 个答案:

答案 0 :(得分:3)

getmntent() family应该符合您的需求。

  

命名

     

getmntent,setmntent,addmntent,endmntent,hasmntopt,getmntent_r -          获取文件系统描述符文件条目

     

<强>概要

       struct mntent {
           char *mnt_fsname;   /* name of mounted filesystem */
           char *mnt_dir;      /* filesystem path prefix */
           char *mnt_type;     /* mount type (see mntent.h) */
           char *mnt_opts;     /* mount options (see mntent.h) */
           int   mnt_freq;     /* dump frequency in days */
           int   mnt_passno;   /* pass number on parallel fsck */
       };
     

<强>描述

     

这些例程用于访问文件系统描述文件   / etc / fstab和挂载的文件系统描述文件/ etc / mtab。

     

setmntent()函数打开文件系统描述文件   filename并返回一个可由getmntent()使用的文件指针。   参数类型是所需的访问类型,可以采用相同的方式   value作为fopen(3)的模式参数。

     

getmntent()函数读取文件系统的下一行   来自stream的描述文件并返回指向结构的指针   包含文件中一行的分解字段。指针   指向后续覆盖的静态内存区域   调用getmntent()。

     

addmntent()函数将mntent结构mnt添加到结尾   开放流。

     

endmntent()函数关闭与之关联的流   文件系统描述文件。

     

hasmntopt()函数扫描mnt_opts字段(见下文)   mntent结构mnt用于匹配opt的子字符串。看到   和mount(8)用于有效的挂载选项。

     

reentrant getmntent_r()函数类似于getmntent(),但是   将struct mount存储在提供的* mntbuf中并存储字符串   由提供的数组buf中的结构中的条目指向   大小buflen。

     

mntent结构定义如下:

{{1}}
     

...

答案 1 :(得分:1)

检查用于写入的打开文件的文件系统是否以只读方式挂载的最简单方法是检查MainActivity变量是否存在errno错误。

如果您无法在该文件系统中拥有可写目录或文件,则无法通过可移植方式检查文件系统是否已变为只读(如果由于设备错误而变得更多,则更多)< / p>

另一种方法是要求管理员检查,或尝试自己阅读EROFS文件。但这只是linux特有的。