给定文件或目录的路径,我如何确定该文件的挂载点?例如,如果/tmp
作为tmpfs
文件系统挂载,那么给定文件名/tmp/foo/bar
我想知道它存储在tmpfs
根目录为/tmp
.
这将在 C++ 中,我想避免通过system()
. 代码应该是健壮的——不一定要防止故意篡改,但绝对要面对嵌套的挂载点、符号链接等。
我还没有找到一个简单的系统调用来做到这一点。看来我得自己写支票了。这是我计划的大致轮廓。
readlink
通过shell 命令规范化文件名。如何?/etc/mtab
与getmntent()
& co一起阅读。- 确定文件的相应挂载条目。如何?
对于#1,是否有一个简单的系统调用,或者我是否需要读取路径的每个目录组件并readlink(2)
在它们是符号链接时解析它们?和手柄.
和..
我自己?好像很痛。
对于#3,我对如何做到这一点有各种想法。不确定哪个最好。
open()
使用该文件、其父级、其父级的父级等,openat(fd, "..")
直到我到达其中一个/etc/mtab
条目。(我怎么知道我什么时候做?fstat()
他们并比较 inode 号?)- 在挂载表中找到最长的目录名,它是我的文件名的子字符串。
我倾向于第一个选项,但在我全部编写代码之前,我想确保我没有忽略任何东西——理想情况下,一个内置函数已经做到了!