为什么我们不能通过简单地将值赋给新变量来复制文件描述符?
Why can't we copy file descriptors just by plainly assigning the value to new variables?
我对文件描述符感到困惑。我知道要复制它们,我们需要系统调用 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()
之类的调用不会影响任何已经打开的文件描述符;它们 return 一个以前未使用过的新文件描述符。)
一种看待它的方法:保存文件描述符编号的变量没有什么特别之处——任何保存相同编号的 int
变量都可以用作文件描述符。但是更改文件描述符引用的文件是一项复杂得多的工作,需要系统调用。
我对文件描述符感到困惑。我知道要复制它们,我们需要系统调用 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()
之类的调用不会影响任何已经打开的文件描述符;它们 return 一个以前未使用过的新文件描述符。)
一种看待它的方法:保存文件描述符编号的变量没有什么特别之处——任何保存相同编号的 int
变量都可以用作文件描述符。但是更改文件描述符引用的文件是一项复杂得多的工作,需要系统调用。