这里我需要澄清一下: 我有一些这样的代码:
child_map[0] = fileno(fd[0]);
..
pid = fork();
if(pid == 0)
/* child process*/
dup2(child_map[0], STDIN_FILENO);
现在,STDIN_FILENO 和 child_map[0] 会指向同一个文件描述符吗? future 的输入是否会取自 child_map[0] 和 STDIN_FILENO 指向的文件? 我认为 STDIN_FILENO 表示标准输出(终端)。
最佳答案
在 dup2()
之后,child_map[0]
和 STDIN_FILENO
将继续作为独立的文件描述符 ,但它们将引用相同的打开文件描述。这意味着,例如,如果 child_map[0] == 5
和 STDIN_FILENO == 0
,则文件描述符 5
和 0
将在 dup2()
之后保持打开状态。
引用相同的打开文件描述意味着文件描述符是可互换的——它们共享属性,如当前文件偏移量。如果您对一个文件描述符执行 lseek()
,则两个文件的当前文件偏移量都会更改。
要关闭打开的文件描述,必须关闭指向它的所有文件描述符。
在 dup2()
之后执行 close(child_map[0])
是很常见的,它只留下一个打开文件的文件描述符。
关于linux - dup2 在这种情况下实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686497/