Shell 在Unix中管理文件描述符
我在编程shell以正确执行文件IO重定向时遇到一些问题。在我的印象中,算法就是这样运行的 给出命令: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可用 从这里
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.