【问题标题】:Redirecting stdout to stdin of another program将标准输出重定向到另一个程序的标准输入
【发布时间】:2015-05-07 21:25:30
【问题描述】:

我在这里浏览了大量的 Google 链接和问题,以了解 pipping 的工作原理,但我似乎无法理解将我的标准输出重定向到我的第二个程序的标准输入的概念。

我正在尝试创建一个在文本字符周围移动、对其进行加密并将其放入字符串的程序。我的第二个程序应该获取该字符串并对其进行解密。我了解创建管道所需的功能,但我不明白的是它是如何指向下一个程序的,我看过的所有源代码似乎都在其中而不是在第二个程序。

【问题讨论】:

  • 向我们展示一些代码...
  • 堆栈溢出是a Q&A resource, not a help forum。它适用于可以有明确正确答案的有关编码的特定问题,而不是提出开放式问题以寻求广泛概述、教程、介绍性信息或有关入门的一般指示的地方。请阅读Tour 页面和以下关于提出好问题的建议:[How to Ask]、[Writing the perfect question]。
  • 是否有必要为此任务使用两个不同的程序?如果我理解正确,它可以很容易地在一个可执行文件中实现。
  • 您使用哪种语言,C 还是 C++?比如C语言没有std::string也没有std::istream
  • 您是否希望在两个程序之间共享数据?您是否有一个程序启动另一个程序并在两者之间共享?

标签: c++ c unix pipeline piping


【解决方案1】:

在两个程序的标准流之间建立管道是您如何启动程序的问题。如果一个执行另一个(例如fork()/execlp()),则父级使用pipe() 创建管道,父级和子级使用dup2() 将管道末端与适当的文件描述符相关联(在执行之前执行官,在孩子的情况下)。

如果两个程序都没有启动另一个,那么启动它们的程序(通常是一个 shell)必须设置管道。

【讨论】:

    【解决方案2】:

    假设您在基于 unix 的操作系统中使用 shell,则管道 | 字符用于创建此链接。例如:我想运行program1并将program1的标准输出重定向到program2作为它的标准输入。

    program1 | program2

    这是一个 linux 示例,它使用 ls 获取目录内容的名称,然后将其传送到 head -3 以获取前三个文件的名称。然后我们将这三个名称通过管道传递给tail -1 以获取最后一个(或目录中第三个文件的名称)。

    ls | head -3 | tail -1

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2014-02-10
      • 2023-04-02
      相关资源
      最近更新 更多