【问题标题】:Redirecting file contents into another program in C将文件内容重定向到C中的另一个程序
【发布时间】:2016-05-27 02:52:36
【问题描述】:

制作一个基本的外壳,我需要处理文件重定向。具体来说,我很难将数据输入到像sort 这样的程序中,例如从文件中。

命令行上的内容如下所示:

$ sort < test.txt

如何在我自己用 C 语言制作的 mini shell 中完成这种功能?

我认为可能sortstdin 读取,但我想由于只读方面我不能真正将文件的内容写入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


【解决方案1】:

您需要使用freopen

它的工作原理与fopen 类似。第一个参数是文件名,第二个参数是模式,第三个参数是要重定向的文件指针。返回值是新的文件指针。所以如果你想重定向标准输入:

FILE *fp = freopen("input.txt", "r", stdin);

它在失败时返回一个 NULL 指针,就像fopen

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2013-03-06
    • 2014-02-09
    • 2010-12-10
    • 2010-11-14
    • 2018-10-13
    相关资源
    最近更新 更多