C 为什么可以';我们是否仅仅通过简单地将值赋给新变量来复制文件描述符?

C 为什么可以';我们是否仅仅通过简单地将值赋给新变量来复制文件描述符?,c,file,low-level,C,File,Low Level,我对文件描述符感到困惑。我知道要复制它们,我们需要系统调用dup2()或dup()。但是为什么我们不能通过将旧值赋给新变量来复制它们呢?例如,我们为什么可以这样做 int f[2]; pipe(f); // I call pipe just to create two file descriptors, nothing special int new_descriptor = f[0]; // this line is where I'm confused 是因为f[0],f[1]中的整数有特

我对文件描述符感到困惑。我知道要复制它们,我们需要系统调用dup2()或dup()。但是为什么我们不能通过将旧值赋给新变量来复制它们呢?例如,我们为什么可以这样做

int f[2];
pipe(f); // I call pipe just to create two file descriptors, nothing special
int new_descriptor = f[0]; // this line is where I'm confused
是因为f[0],f[1]中的整数有特定的含义,并且是某种编码的吗?
谢谢

您可以通过赋值复制文件描述符。您不能更改特定文件描述符编号(如
1
)所指的文件-为此,您需要
dup()
dup2()
-或
fcntl()
,或
close()
。(诸如
open()
pipe()
之类的调用不会影响任何已打开的文件描述符;它们会返回以前未使用过的新文件描述符。)


一种看待它的方式是:保存文件描述符编号的变量没有什么区别——任何保存相同编号的
int
变量都可以用作文件描述符。但是更改文件描述符引用的文件是一项复杂得多的工作,需要系统调用。

我现在就知道了!非常感谢您的清晰解释!:)回答得很好。我想补充一点,调用
dup
dup2
会增加打开文件的引用计数,因此关闭原始文件描述符不会关闭文件,仍然可以使用
dup
返回的新文件描述符访问该文件(仅当引用计数达到0时文件才会关闭)。@Myst:Correct,但是我计划不去区分开放文件描述符和开放文件描述之间的区别,这两种描述都与“开放文件”是分开的,因为单个文件可以用不同的开放文件描述符打开多次。啊!在我之前评论的最后一句话中,我的意思是“不同的打开文件描述”。
dup
创建并返回指向同一文件的新fd。fd是进程文件表的索引,因此
dup
实际上会找到进程文件表上的下一个打开点,将指向(内核中)文件结构的指针复制到该点,并将索引返回到用户空间。