首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有Linux C API调用来查询已挂载的文件系统,以查看它是否为只读的?

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

Stack Overflow用户
提问于 2017-02-08 06:02:56
回答 2查看 2.9K关注 0票数 3

首先,提供一些背景信息来提供这个问题的一些动机:我有一个在无头Linux服务器上运行的程序,它在几个可移动的外部硬盘上读/写文件,每个硬盘都是用ext4文件系统格式化的。在极少数情况下,其中一个驱动器上的文件系统元数据由于某种原因而损坏(尽管有ext4日志记录),这可能会导致ext4文件系统驱动器检测到问题并将分区重新装载为只读分区,这可能是为了防止级联错误进一步损坏驱动器。

好的,很公平;但我现在想要做的是向我的程序添加一个函数,该函数可以检测驱动器何时处于重新挂载的只读状态,以便它可以主动通知用户其驱动器出现了问题。

我的问题是,查询文件系统以确定它是否以只读方式挂载的优雅/受支持的方法是什么?

尝试将文件写入文件系统还不够好,因为这可能会因为其他原因而失败,还因为如果没有必要的话,我不想写入文件系统。

我的程序可以fopen("/proc/mounts", "r")和解析它生成的文本行(在与我的分区对应的行上为"rw“标记),如果有必要的话,我会这样做,但是这个解决方案看起来有点老套(太像屏幕抓取了,如果文本格式发生变化,很容易崩溃)。

那么,有没有一些轻量级/专门构建的Linux系统调用可以用来告诉我给定的文件系统挂载点(例如"/dev/sda1")当前是否为只读挂载?看起来stat()也许能做到这一点,但我看不出怎么做。

EN

回答 2

Stack Overflow用户

发布于 2017-02-08 06:08:29

getmntent() family应该能满足您的需求。

NAME

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

概要

#include #include 文件*setmntent(const char *文件名,const char *type);struct mntent *getmntent(文件*流);int addmntent(文件*流,常量结构mntent *mnt);int endmntent(文件*流);char *hasmntopt(常量结构mntent *mnt,常量char *opt);/* GNU扩展*/ #包括结构内容*getmntent_r(文件*流,结构内容*mntbuf,字符*buf,整型buflen);

描述

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

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

函数的作用是:从流中读取文件系统描述文件的下一行,并返回一个指针,该指针指向一个结构,该结构包含文件中某一行中分离出来的字段。指针指向内存的一个静态区域,该区域被后续的getmntent()调用所覆盖。

函数的作用是:将内容结构mnt添加到打开的流的末尾。

函数的作用是:关闭与文件系统描述文件相关的流。

hasmntopt()函数扫描mntent结构mnt的mnt_opts字段(见下文),查找匹配opt的子字符串。有关有效的装载选项,请参见和mount(8)。

可重入的getmntent_r()函数类似于getmntent(),但是它将结构挂载存储在所提供的*mntbuf中,并将该结构中的条目所指向的字符串存储在所提供的大小为buflen的数组buf中。

内容结构定义如下:

struct mntent { char *mnt_fsname;已安装文件系统的/*名称*/ char *mnt_dir;/*文件系统路径前缀*/ char *mnt_type;/*安装类型(请参阅mntent.h) */ char *mnt_opts;/*安装选项(请参阅mntent.h) */ int mnt_freq;/*转储频率(以天为单位) */ int mnt_passno;并行/*上的fsck通过数*/ };

...

票数 3
EN

Stack Overflow用户

发布于 2017-02-09 14:40:59

要检查要写入的打开文件的文件系统是否已以只读方式挂载,最简单的方法是检查errno变量中的EROFS错误。

如果您不可能在该文件系统中具有可写目录或文件,则无法获得检查文件系统是否已变为只读的便携方法(如果由于设备错误而变为只读,则更多)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42100866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档