0

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

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 表示标准输出(终端)。

4

3 回答 3

1

之后dup2()child_map[0]STDIN_FILENO将继续是单独的文件描述符,但它们将引用相同的打开文件描述。这意味着,例如,如果child_map[0] == 5STDIN_FILENO == 0,那么文件描述符50都将在dup2().

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

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

通常在close(child_map[0])之后执行dup2(),它只留下一个文件描述符对文件打开。

于 2011-07-14T03:43:06.877 回答
0

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

事实上,这就是 shell 使用重定向输入启动进程的方式。

例如

cat somefile | uniq

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

于 2011-07-13T22:39:05.107 回答
0

STDIN_FILENOstdin,不是stdout。(也有一个STDOUT_FILENO。)传统上前者是 0,后者是 1。

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

于 2011-07-13T22:40:31.513 回答