【发布时间】:2016-05-27 02:52:36
【问题描述】:
制作一个基本的外壳,我需要处理文件重定向。具体来说,我很难将数据输入到像sort 这样的程序中,例如从文件中。
命令行上的内容如下所示:
$ sort < test.txt
如何在我自己用 C 语言制作的 mini shell 中完成这种功能?
我认为可能sort 从stdin 读取,但我想由于只读方面我不能真正将文件的内容写入stdin,所以我想知道我是如何实际获取这些数据的例如像sort 这样的东西?我目前正在使用 fork,然后使用 execvp() 执行程序。
【问题讨论】:
-
shell 打开文件(可能在子进程中),然后用
dup2()排列东西,以便文件连接到sort进程的标准输入(以及原始文件描述符)文件已关闭)。然后它运行sort(假设没有其他 I/O 重定向需要处理)。请记住适当地处理打开的错误(并且大概您已经处理了exec*()的故障)。关于自制 shell 中的 I/O 重定向的 SO 问题肯定有数百个。 -
一种常见的方法是使用
dup2。在fork之后和exec之前,您打开文件,然后dup2它的fd 与STDIN_FILENO作为新的fd。目标程序只需要从标准输入读取,不需要知道它是来自文件还是来自终端输入。 -
也许你可以试试
freopen()? -
@kaylum 对于从标准输出到文件的重定向(胡萝卜转向其他方向),我一直在使用这个答案中的一些修改位:stackoverflow.com/a/14543455/1044984。我基本上应该再做一次这样的事情吗?
标签: c shell stdout stdin io-redirection