Linux函数获取挂载点

tMC*_*tMC 14 c linux mount libc

标准Linux库中是否有一个函数(或接口; ioctl,netlink等),它将直接从内核返回当前的挂载而不解析/ proc? strace在mount命令中,它看起来像是解析/ proc中的文件

Pet*_*esh 37

请参阅答案底部的澄清,了解本答案中使用的推理.

你有什么理由不使用getmntentlibc库调用吗?我确实意识到它与"一体化"系统调用不同,但它应该允许您获取相关信息.

#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);
}
Run Code Online (Sandbox Code Playgroud)

澄清

考虑到OP澄清有关试图做到这一点,而不具有/proc安装,我要澄清:

除了从linux内核获取已安装文件系统的完全限定列表之外,没有其他工具/proc可用.没有系统调用,没有ioctl.该/proc接口在商定接口.

话虽如此,如果你没有/proc安装,你将不得不解析/etc/mtab文件 - 传入/etc/mtab而不是/proc/mounts初始setmntent调用.

这是一个商定的协议,mountunmount 命令维护文件/ etc/mtab中当前安装的文件系统的列表.这些命令的几乎所有linux/unix/bsd手册页都详细介绍了这一点.所以,如果你没有/proc,你可以排序的靠这个文件的内容.它不能保证是真理的来源,但约定是这些事物的惯例.

因此,如果您没有/proc,您将/etc/mtabgetmntent下面的libc库调用中使用以获取文件系统列表; 否则你可以使用/proc/mounts或之一/proc/self/mountinfo(现在推荐使用/proc/mounts).

  • 请记住,`getmntent` 不是线程安全的。有`getmntent_r`(GNU 扩展)。 (2认同)
  • 是的,很清楚 *ent 调用的整个 API 集群的所有限制。现在首选从每个进程的 mountinfo 文件中读取。 (2认同)

Aar*_*lla 1

没有系统调用来列出此信息;相反,您可以在文件中找到它/etc/mtab

  • @tMC:`/proc/mounts` 是一个实现细节。`/etc/mtab` 是一个标准文件,您几乎可以在任何类 Unix 系统上找到它。我没有检查,但我认为这是标准的一部分。所以您可以信赖它。我不会说“在大多数系统上”。在我的 Ubuntu 和 OpenSuSE 系统中,它是一个普通文件。我确实有 `/proc/mounts` 但它是一个链接:-) (2认同)