当前位置: 首页 > 面试题库 >

文件挂载在哪里?

谢和同
2023-03-14
问题内容

给定文件或目录的路径,如何确定该文件的安装点?例如,如果/tmp作为tmpfs文件系统挂载,则给定文件名,/tmp/foo/bar我想知道它存储在tmpfs根目录下/tmp

这将是C ++语言,我希望避免通过调用外部命令system()。该代码应该健壮-不一定要防止故意的篡改,但绝对要面对嵌套的安装点,符号链接等。

我还没有找到一个简单的系统调用来执行此操作。看来我得自己写支票。这是我计划的粗略概述。

  1. readlinkshell命令中规范化文件名。 怎么样?
  2. /etc/mtabgetmntent()&合作阅读。
  3. 确定文件的相应安装项。 怎么样?

对于#1,有一个简单的系统调用,还是我需要读取路径的每个目录组件,并用readlink(2)符号链接来解析它们?和处理...自己?似乎很痛苦。

对于#3,我对如何执行此操作有各种想法。不知道哪个最好。

  1. open()文件,其父级,其父级的父级等,openat(fd, "..")直到到达其中一项为止/etc/mtab。( 我怎么知道什么时候?fstat()它们并比较inode的数量?
  2. 在安装表中找到最长的目录名称,它是我文件名的子字符串

我倾向于第一种选择,但是在编写全部代码之前,我想确保我没有忽略任何东西-理想情况是内置函数已经做到了!


问题答案:

这就是我想出的。原来,通常不需要遍历父目录。您所要做的就是获取文件的设备号,然后找到具有相同设备号的相应安装条目。

struct mntent *mountpoint(char *filename, struct mntent *mnt, char *buf, size_t buflen)
{
    struct stat s;
    FILE *      fp;
    dev_t       dev;

    if (stat(filename, &s) != 0) {
        return NULL;
    }

    dev = s.st_dev;

    if ((fp = setmntent("/proc/mounts", "r")) == NULL) {
        return NULL;
    }

    while (getmntent_r(fp, mnt, buf, buflen)) {
        if (stat(mnt->mnt_dir, &s) != 0) {
            continue;
        }

        if (s.st_dev == dev) {
            endmntent(fp);
            return mnt;
        }
    }

    endmntent(fp);

    // Should never reach here.
    errno = EINVAL;
    return NULL;
}

感谢@RichardPennington率先提出realpath()并比较设备编号而不是inode编号。



 类似资料:
  • 问题内容: 我有一个用于下载文件的网络界面。当请求进入时,我的glassfish服务器从Web服务流式传输文件,然后将内容写入输出流。我的代码工作正常,除非当文件大小变得很大(如200 MB以上)时,它挂起,显示0%在浏览器中下载,并且文件从未下载。 当我在while循环内移动flush()方法时,它也适用于大型文件。我不确定将flush()放入循环是否有问题。不知道这东西实际上是如何工作的。我的

  • 问题内容: 我在Windows中使用Docker Toolbox,并尝试将Windows文件夹安装在docker-compose.yml文件中,如下所示: 我的目标是将Docker Toolbox已经创建的boot2docker VM映像安装到该映像,然后从该映像加载到其中的nginx容器。 不幸的是,它不起作用。我在boot2docker映像中找到一个文件夹sss,但是它没有指定我的Window

  • 问题内容: 我正在使用使用docker映像的Selenium: 它有效,我可以连接到任何URL并导航。但是,当我单击按钮下载文件时,有时会将文件(部分保存为)保存到,有时保存到…无处,或者找不到我找不到的其他位置… 有什么理由吗? 我也尝试使用打开驱动程序 但它返回一个奇怪的错误 鉴于所有链接都在Windows中,但是我的selenium在docker容器或Ubuntu中运行,因此我可以理解为什么

  • 问题内容: 我正在尝试将源文件安装到位于/ var / dynamo的Docker目录中。我希望能够在本地运行Docker并在工作时使用本地文件。 使用运行命令: 与我的 Dockerfile 但是,当我将bash放入容器并运行时,该目录 为空! 运行显示目录已正确安装 Docker版本是1.9.1 问题答案: Docker&Virtualbox在将卷装载到/ Users目录之外时似乎出现了问题。

  • 我尝试读取数据块中的dbc文件(从s3存储桶装载)。文件路径是: 如何使用火花读取此文件? 我尝试了下面的代码: 但它生成并错误: 谢谢帮忙!

  • 《 Linux挂载》一节讲到,所有的硬件设备必须挂载之后才能使用,只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载。 通过学习 Linux 文件系统,我们可以对挂载的含义进行引申,挂载指的是将硬件设备的文件系统和 Linux 系统中的文件系统,通过指定目录(作为挂载点)进行关联。而要将文件系统挂载到 Linux 系统上,就需要使用  m