在这种情况下,dup2实际上做了什么?

时间:2011-07-13 22:33:26

标签: linux linux-kernel

我需要澄清一下: 我有一些像这样的代码:

child_map[0] = fileno(fd[0]);
..
pid = fork();
if(pid == 0)
/* child process*/
dup2(child_map[0], STDIN_FILENO);

现在,STDIN_FILENO和child_map [0]会指向相同的文件描述符吗?未来的输入是否会从child_map [0]和STDIN_FILENO指向的文件中获取? 我以为STDIN_FILENO意味着标准输出(终端)。

3 个答案:

答案 0 :(得分:1)

dup2()之后,child_map[0]STDIN_FILENO将继续分开文件描述符,但它们将引用相同的打开的文件说明。这意味着,例如,如果child_map[0] == 5STDIN_FILENO == 0,那么文件描述符50将在dup2()之后保持打开状态。

引用相同的打开文件描述意味着文件描述符是可互换的 - 它们共享属性,如当前文件偏移量。如果在一个文件描述符上执行lseek(),则会更改当前文件偏移量。

要关闭打开的文件说明,必须关闭指向它的所有文件描述符。

close(child_map[0])之后执行dup2()是很常见的,只留下一个文件描述符对文件开放。

答案 1 :(得分:0)

它会导致从stdin读取的所有函数从指定的文件描述符中获取数据,而不是从父{1}}(通常是终端,但可能是文件或管道,具体取决于shell重定向) )。

实际上,这就是shell如何使用重定向输入启动进程。

e.g。

stdin

cat somefile | uniq 的标准输入绑定到管道,而不是终端。

答案 2 :(得分:0)

STDIN_FILENOstdin,而不是stdout。 (也有STDOUT_FILENO。传统上,前者为0,后者为1。

此代码使用dup2()将子项的stdin重定向到父项已打开的另一个文件描述符。 (实际上它与用于shell中重定向的基本机制相同。)之后通常会发生的事情是,从stdin读取的其他程序是exec,因此代码已经设置了{ {1}}为此。