gpt4 book ai didi

c - Linux O_PATH 文件描述符的语义?

转载 作者:IT王子 更新时间:2023-10-29 00:51:49 26 4
gpt4 key购买 nike

Linux 2.6.39 引入了O_PATH 打开模式,(粗略地说)根本不真正打开文件(即不创建打开文件描述),而只是给出一个文件描述符,它是未打开目标的句柄。它的主要用途是作为 *at 函数(openat 等)的参数,它似乎适合作为 POSIX 2008 O_SEARCH 的实现 Linux 以前缺少的功能。但是,我一直找不到关于 O_PATH 确切语义的任何好的文档。我有几个具体问题:

  1. 在 Linux O_PATH 文件描述符上可以进行哪些操作? (只有 *at 功能?)
  2. O_PATH 对非目录有用吗?
  3. 文件描述符是如何绑定(bind)到底层文件系统对象的,如果它被移动、删除等会发生什么? O_PATH 文件描述符是否算作引用,以防止在最后一个链接取消链接时释放对象?等

最佳答案

使用 open(directory, O_PATH | O_DIRECTORY) 获得的文件描述符不仅对 ...at() 函数有用,而且对 fchdir() (我相信从内核版本 3.2.23 开始)。

最近还有一个patch对于新的系统调用,fbind() ,这将允许非常长的 Unix 域套接字名称。套接字文件首先使用 mknod(path, mode | S_IFSOCK, (dev_t)0) 创建,然后使用 open(file, O_PATH) 打开。如此获得的文件描述符和一个 Unix 域套接字描述符被传递给 fbind(),以将套接字绑定(bind)到路径名。这是否会包含在 Linux 内核中还有待观察——尽管即使是,也需要数年时间才能依赖它普遍可用。 (不过,作为解决太长的 Unix 域套接字名称的变通方法,它很快就会可行。)

我想说 O_PATH 目前只对目录有用;将来可能会发现文件用途。除了 future fbind() 或类似 future 系统调用的可能性之外,我不知道对使用 O_PATH 打开的文件有任何使用文件描述符的情况。甚至 fstatvfs() 也不会工作,至少在 3.5.0 内核上是这样。

在 Linux 中,inode(文件内容和元数据)只有在最后一个打开的文件描述符关闭时才会被释放。删除(取消链接)文件时,您只会删除与 inode 关联的文件名。因此,有两个独立的文件系统对象与文件描述符相关联:用于打开对象的名称,以及引用的底层 inode 。该名称仅用于路径解析,即调用 open()(或等效项)时。所有数据和元数据都在 inode 中。

使用 O_PATH 获得的文件描述符的行为(至少在内核 3.5.0 上)就像普通文件描述符 wrt。移动和重命名用于打开描述符的名称或名称组件。 (描述符保持有效,因为它引用 inode,文件名对象仅在路径解析期间使用。保持描述符打开将保持分配的 inode 资源,即使打开描述符 O_PATH .)

关于c - Linux O_PATH 文件描述符的语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com