给定文件或目录的路径,我如何确定该文件的挂载点?例如,如果/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 号?)- 在挂载表中找到最长的目录名,它是我的文件名的子字符串。
我倾向于第一个选项,但在我全部编写代码之前,我想确保我没有忽略任何东西——理想情况下,一个内置函数已经做到了!