获取挂载点的Linux函数
Posted
技术标签:
【中文标题】获取挂载点的Linux函数【英文标题】:Linux function to get mount points 【发布时间】:2012-03-06 01:11:19 【问题描述】:标准 Linux 库中是否有一个函数(或接口;ioctl、netlink 等)可以直接从内核返回当前挂载而不解析 /proc? strace
挂载命令,好像解析/proc中的文件
【问题讨论】:
***.com/questions/5095976/mount-system-call @Satish 挂载文件系统 - 它不返回 当前挂载 为什么要避开/proc/
??在linux下,这是检索此类信息的首选方式!而且也很简单!!
【参考方案1】:
请参阅答案底部的说明,了解此答案中使用的推理。
您是否有任何理由不使用getmntent
libc 库调用?我确实意识到它与“一体式”系统调用不同,但它应该允许您获取相关信息。
#include <stdio.h>
#include <stdlib.h>
#include <mntent.h>
int main(void)
struct mntent *ent;
FILE *aFile;
aFile = setmntent("/proc/mounts", "r");
if (aFile == NULL)
perror("setmntent");
exit(1);
while (NULL != (ent = getmntent(aFile)))
printf("%s %s\n", ent->mnt_fsname, ent->mnt_dir);
endmntent(aFile);
澄清
考虑到 OP 澄清了尝试在没有安装 /proc
的情况下尝试执行此操作,我将澄清一下:
在
/proc
之外没有 工具可用于从 linux 内核获取已挂载文件系统的完全限定列表。没有系统调用,没有ioctl。/proc
接口是约定的接口。
话虽如此,如果您没有安装 /proc
,您将不得不解析 /etc/mtab
文件 - 将 /etc/mtab
而不是 /proc/mounts
传递给初始的 setmntent
调用。
mount
和unmount
命令 将在文件/etc/mtab 中维护当前安装的文件系统列表,这是一个商定的协议。这在几乎所有linux/unix/bsd 这些命令的手册页中都有详细说明。因此,如果您没有/proc
,您可以在某种程度上 依赖此文件的内容。不能保证它是事实的来源,但约定是这些事情的约定。
所以,如果您没有/proc
,您可以在下面的getmntent
libc 库调用中使用/etc/mtab
来获取文件系统列表;否则你可以使用/proc/mounts
或/proc/self/mountinfo
之一(现在推荐使用/proc/mounts
)。
【讨论】:
我有一个嵌入式系统,可以在启动过程中使用此信息;在挂载 /proc 之前。df
和mount
都使用/proc/self/mountinfo
而不是/proc/mounts
,但结果是一样的。
请记住,getmntent
不是线程安全的。有getmntent_r
(GNU 扩展)。
是的,非常清楚 *ent 调用的整个 API 集群的所有限制。现在首选从每个进程的 mountinfo 文件中读取。【参考方案2】:
没有系统调用来列出这些信息;相反,您可以在文件 /etc/mtab
【讨论】:
mtab 只是大多数系统上 /proc/mounts 的符号链接。 @tMC:/proc/mounts
是一个实现细节。 /etc/mtab
是一个标准文件,您几乎可以在任何类 Unix 系统上找到它。我没有检查,但我认为这是标准的一部分。所以你可以依靠它。而且我不会说“在大多数系统上”。在我的 Ubuntu 和 OpenSuSE 系统中,它是一个纯文件。我确实有/proc/mounts
,但它是一个链接:-)
我可以确认 /etc/mtab
不是文件,而是 Raspbian Jessie 上的 /proc/mounts
的链接。以上是关于获取挂载点的Linux函数的主要内容,如果未能解决你的问题,请参考以下文章
linux下插入U盘自动挂载后,用C获取其挂载点(cat /proc/mounts)