Shell 在Unix中管理文件描述符

Shell 在Unix中管理文件描述符,shell,unix,sh,io-redirection,Shell,Unix,Sh,Io Redirection,我在编程shell以正确执行文件IO重定向时遇到一些问题。在我的印象中,算法就是这样运行的 给出命令:cat file>newfile 我的sh如下所示: 1) 将命令分为两部分,cat file和newfile 2) fd=open(newfile,O_WRONLY | O_CREAT)//这会打开新文件进行写入,或者在文件不存在时创建文件。 3) close(0)//关闭stdout 4) dup(fd)//这应该将newfile的文件描述符复制到stdout中,因为stdout可用 从这里

我在编程shell以正确执行文件IO重定向时遇到一些问题。在我的印象中,算法就是这样运行的

给出命令:
cat file>newfile

我的sh如下所示:

1) 将命令分为两部分,
cat file
newfile

2)
fd=open(newfile,O_WRONLY | O_CREAT)//这会打开新文件进行写入,或者在文件不存在时创建文件。

3)
close(0)//关闭stdout

4)
dup(fd)//这应该将newfile的文件描述符复制到stdout中,因为stdout可用

从这里开始,我认为我已经完成了,fd0的所有输出(例如printfs()、write(0、buf、64)都将进入我的新文件。但是,一旦我这样做,我的程序就会循环错误“fd 0未打开读取”,这似乎是正确的,因为0应该是我未读取的文件。但不确定尝试从0读取的内容

这个逻辑是正确的还是我遗漏了什么?谢谢

3)
close(0)//关闭stdout

但是
0
实际上是
stdin
。在


您可以使用这些符号常量来避免类似的错误。

除了@nemo的注释外,可能最好是明确的:
dup2(fd,1)
,这将首先为您关闭现有的文件描述符1。好的,谢谢大家。我完全混淆了stdout和STDIN,因为系统头中给出了#定义:stdout_FILENO和STDIN_FILENO
The following symbolic constants shall be defined for file streams:

STDERR_FILENO
    File number of stderr; 2.
STDIN_FILENO
    File number of stdin; 0.
STDOUT_FILENO
    File number of stdout; 1.