【问题标题】:Is it possible to redirect stdout as stdin to same program?是否可以将标准输出作为标准输入重定向到同一个程序?
【发布时间】:2014-02-10 17:05:13
【问题描述】:

我正在编写一个过滤器,并且正在探索一种编写程序的方法。我想知道这是否可能:从标准输入中的输入写入标准输出,但重定向此标准输出,以便程序再次读取生成的标准输出,就好像它是标准输入一样,从而重新处理数据。我不希望将数据存储在一个巨大的数组中——我希望只使用流来做到这一点。这甚至可能吗? (如果不是,那也没关系。)另外,请注意:我希望仅在 C 代码的单个源文件中执行此操作。

【问题讨论】:

  • 这很有可能,但如何做到这一点很大程度上取决于您使用的系统(例如 Windows 或 POSIX(如 Linux、OSX))?
  • 对不起,我刚刚添加了一条注释:我只想使用代码来执行此操作。我相信这可以通过 Unix 命令行上的管道来实现,但我想使用纯 C 来做到这一点。
  • @JoachimPileborg Windows 有足够的 POSIX 接口来执行此操作,不是吗?
  • @Potatoswatter 大多数情况下,但仍然有些不兼容(尤其是它的_pipe 函数)。
  • 您可以用您的标准输出替换您当前的标准输入。但听起来你宁愿消耗整个现有的标准输入,然后重新处理你创建的输出?

标签: c pipe stdout stdin io-redirection


【解决方案1】:

是的,您可以在任何 POSIX 系统中为自己创建一个pipe

但是没有免费的午餐。如果你需要存储数据,它必须去某个地方。管道由操作系统管理的缓冲区支持。

您可以从字面上将管道的末端设置为支持 stdinstdout(如 Joachim 的回答),但我建议不要这样做,因为它会覆盖程序的通常输入和输出通道。 (C 和任何 POSIX 服务都不会“发送”流,以便用户可以看到它并在程序中回显它。)

【讨论】:

    【解决方案2】:

    创建一个pipeDuplicate 管道的读取端为新的STDIN_FILENO,写入端为STDOUT_FILENO,一切就绪。您现在写给stdout 的所有内容都将在stdin 上提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多