在自定义shell中编写输入/输出文件重定向命令

时间:2014-04-18 19:14:41

标签: c bash shell unix

我在C中编写自己的shell。它相当简单,但我想再实现三个命令。首先是带或不带参数的命令,其输出被重定向到文件。第二种是带有或不带参数的命令,其输出附加到文件中。最后,一个带或不带参数的命令,其输入从文件重定向。

所有这些命令都可以使用系统调用freopen()dup()dup2()来实现。

第一个命令的示例可以是ls -l > fileName.txt。 这应该获取命令的输出并将其放在fileName.txt

第二个命令的示例可以是ls -l >> fileName.txt。 这应该获取命令的输出并将其附加到文件fileName.txt中的任何内容。

最后一个命令的示例可能是bc < file。这将获取命令的输出并将其放入指定的文件中。

这不应该太难实现,但由于某种原因,我不知道该怎么做并且遇到了一些严重的麻烦。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我坚持原始系统调用。忘记freopen()并使用open()。 stdio例程使用FILE*流,而系统调用使用整数文件描述符。混合两者保证严重的麻烦。 ; - )

重定向分为4个步骤

  • open()文件重定向到/来自,返回fd
  • close()要重定向的文件,0表示stdin,1表示stdout
  • dup(fd) fd由第一步open()返回
  • close(fd)你不需要它enymore

诀窍是dup()返回新文件描述符的最低可用整数。如果您刚刚关闭标准1,它将返回1,突然您的标准输出指向先前打开的文件。