【问题标题】:Why can't we copy file descriptors just by plainly assigning the value to new variables?为什么我们不能通过简单地将值分配给新变量来复制文件描述符?
【发布时间】:2016-07-11 02:18:11
【问题描述】:

我对文件描述符感到困惑。我知道要复制它们,我们需要系统调用 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] 的整数具有特定的含义,并且是某种编码的吗? 谢谢!

【问题讨论】:

  • dup 创建并返回指向同一文件的新 fd。 fd 是进程文件表的索引,因此dup 实际上在进程文件表上找到下一个打开位置,将指向(内核中)文件结构的指针复制到该位置并将索引返回给用户空间。

标签: c file low-level


【解决方案1】:

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

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

【讨论】:

  • 我现在明白了!非常感谢清晰的解释! :)
  • 很好的答案。我要补充一点,调用dupdup2 会增加打开文件的引用计数,因此关闭原始文件描述符不会关闭文件,使用dup 返回的新文件描述符仍然可以访问该文件(文件只有在引用计数达到 0 时才会关闭)。
  • @Myst:正确,但我打算清楚打开文件描述符和打开文件描述之间的区别,这两者都与“打开文件”分开,因为可以打开单个文件多次使用不同的打开文件描述符。
  • 啊!我在上一条评论的最后一句中的意思是“不同的打开文件描述”。
猜你喜欢
  • 2020-07-25
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多