我在编写shell时遇到了一些麻烦,无法正确执行文件IO重定向。我的印象是这就是算法的用法。
给出一个命令:cat file > newfile
我的确如下:
1)将命令分解为2个部分cat file
和newfile
2)fd = open(newfile, O_WRONLY | O_CREAT) // This opens the newfile for write or creates the file if it does not exist.
3)close(0) // close stdout
4)dup(fd) // this should copy the file descriptor for newfile into stdout since stdout is available
从这里开始,我以为我已经完成了所有输出到fd 0(例如printfs(),write(0,buf,64)等)将进入我的新文件。但是,一旦我这样做,我的程序就会循环错误' fd 0未打开READ'这似乎是正确的,因为0应该是我的文件,不读。不知道是什么尝试从0读取。
这个逻辑是正确的还是我错过了什么?感谢
答案 0 :(得分:2)
3)
close(0) // close stdout
但0
确实是stdin
。 POSIX在<unistd.h>
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.
您可以使用这些符号常量来避免类似的错误。