【发布时间】:2011-01-21 04:23:37
【问题描述】:
给定文件或目录的路径,我如何确定该文件的挂载点?例如,如果/tmp 被挂载为tmpfs 文件系统,那么给定文件名/tmp/foo/bar 我想知道它存储在以/tmp 为根的tmpfs 上。
这将在 C++ 中,我想避免通过 system() 调用外部命令。代码应该是健壮的——不一定要防止故意篡改,但绝对要面对嵌套的挂载点、符号链接等。
我无法找到一个简单的系统调用来执行此操作。看来我得自己写支票了。这是我计划的大致轮廓。
- 通过
readlinkshell 命令规范化文件名。 如何? - 阅读
/etc/mtab和getmntent()& co。 - 确定文件的相应挂载条目。 如何?
对于#1,是否有一个简单的系统调用,或者我是否需要读取路径的每个目录组件并使用readlink(2) 解析它们(如果它们是符号链接)?并自己处理. 和..?好像很痛苦。
对于#3,我对如何做到这一点有各种想法。不确定哪个最好。
-
open()使用openat(fd, "..")的文件、其父级、其父级的父级等,直到我到达/etc/mtab条目之一。 (我怎么知道我什么时候知道?fstat()他们并比较 inode 编号?) - 在挂载表中查找最长的目录名,它是我的文件名的子字符串。
我倾向于第一个选项,但在我全部编写代码之前,我想确保我没有忽略任何东西——理想情况下,一个内置函数已经可以做到这一点!
【问题讨论】:
-
为什么要投票关闭这个?这是个好问题。
-
投票关闭它的人可能只是阅读了标题和/或前两行。这显然是一个适当(且有趣)的问题。