我一直认为执行
现在我想能够看到这对其他类型的特殊文件如何起作用,并回答诸如“以这种方式重新打开文件时进行了什么权限检查?”这样的问题,因此我试图找到实际实现此路径的Linux代码,但是当我开始阅读
open(/proc/self/fd/NUM, flags)
等同于dup(NUM)
,但显然不是这样的!例如,如果你使用dup
复制文件描述符,然后将新的fd设置为非阻塞,这也会影响原来的文件描述符(因为非阻塞状态是文件描述符的属性,而两个文件描述符都指向同一个文件描述符)。然而,如果你打开/proc/self/fd/NUM
,那么你似乎会得到一个新的独立文件描述符,并且可以分别设置旧和新的fd的非阻塞状态。甚至可以使用此方法获得指向同一匿名管道的两个文件描述符,否则是不可能的(example)。另一方面,虽然你可以dup
一个套接字fd,但如果NUM引用套接字,则open("/proc/self/fd/NUM", flags)
会失败。现在我想能够看到这对其他类型的特殊文件如何起作用,并回答诸如“以这种方式重新打开文件时进行了什么权限检查?”这样的问题,因此我试图找到实际实现此路径的Linux代码,但是当我开始阅读
fs/proc/fd.c
时,我很快就迷失在一个不同的操作结构的复杂迷宫中。
所以我的问题是:有人可以解释一下执行open(“/proc/self/fd/NUM”,flags)
的代码路径吗?为了具体说明,让我们假设NUM
指的是管道,我们正在谈论最新的内核发布。
/proc/self/fd/NUM
指向的链接。它只是从打开文件表中复制了struct path*
(基本上是dentry)。这使得任何创建原始struct path
的东西都可以实现打开dentry的inode的功能,在这种情况下是来自fs/pipe.c
的open_fifo。还有TIL:Linux有一个“pipefs”,所有管道都在那里 :O - that other guy