为什么我们不能通过简单地将值分配给新变量来复制文件描述符?

Xue*_* Li 2 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
Run Code Online (Sandbox Code Playgroud)

是因为 f[0],f[1] 的整数具有特定含义,并且是某种编码吗?谢谢!

Jon*_*ler 5

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

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

  • @Myst:正确,但我打算清除打开文件描述符和打开文件描述之间的区别,这两者都与“打开文件”分开,因为可以使用不同的打开文件描述符多次打开单个文件。 (2认同)