我需要澄清一下: 我有一些像这样的代码:
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意味着标准输出(终端)。
答案 0 :(得分:1)
在dup2()
之后,child_map[0]
和STDIN_FILENO
将继续分开文件描述符,但它们将引用相同的打开的文件说明。这意味着,例如,如果child_map[0] == 5
和STDIN_FILENO == 0
,那么文件描述符5
和0
将在dup2()
之后保持打开状态。
引用相同的打开文件描述意味着文件描述符是可互换的 - 它们共享属性,如当前文件偏移量。如果在一个文件描述符上执行lseek()
,则会更改当前文件偏移量。
要关闭打开的文件说明,必须关闭指向它的所有文件描述符。
在close(child_map[0])
之后执行dup2()
是很常见的,只留下一个文件描述符对文件开放。
答案 1 :(得分:0)
它会导致从stdin
读取的所有函数从指定的文件描述符中获取数据,而不是从父{1}}(通常是终端,但可能是文件或管道,具体取决于shell重定向) )。
实际上,这就是shell如何使用重定向输入启动进程。
e.g。
stdin
cat somefile | uniq
的标准输入绑定到管道,而不是终端。
答案 2 :(得分:0)
STDIN_FILENO
为stdin
,而不是stdout
。 (也有STDOUT_FILENO
。传统上,前者为0,后者为1。
此代码使用dup2()
将子项的stdin
重定向到父项已打开的另一个文件描述符。 (实际上它与用于shell中重定向的基本机制相同。)之后通常会发生的事情是,从stdin
读取的其他程序是exec
,因此代码已经设置了{ {1}}为此。