在Unix中管理文件描述符

时间:2013-12-03 21:14:07

标签: shell unix sh io-redirection

我在编写shell时遇到了一些麻烦,无法正确执行文件IO重定向。我的印象是这就是算法的用法。

给出一个命令:cat file > newfile

我的确如下:

1)将命令分解为2个部分cat filenewfile

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读取。

这个逻辑是正确的还是我错过了什么?感谢

1 个答案:

答案 0 :(得分:2)

  

3)close(0) // close stdout

0确实是stdinPOSIX<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.

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