【问题标题】:Multiple pipes in shell implementation in C [duplicate]C中shell实现中的多个管道[重复]
【发布时间】:2013-11-26 12:37:35
【问题描述】:

我正在尝试实现一个 shell,除了多个管道之外,我的一切工作都很好。 即ls -l -a -F | tr [a-z] [A-Z] | sort 我该如何处理?我知道我必须创建多个管道来解决这个问题,但究竟该怎么做呢? 有人可以指导我正确的方向吗?

我目前只管理一个管道,但是当我有两个以上的管道时,我不太确定如何处理这个问题。 我想知道是否有人可以为我提供一些伪代码以及如何解决这个问题

【问题讨论】:

  • 你必须 fork() (你会认为 fork 对管道来说是个问题,但在这种情况下不是)
  • @Hogan 我相信他知道这一点,因为即使只有一根管子你也必须这样做。
  • @Barmar 确实,我在输入我的评论时没有看到您的评论。
  • 即使没有管道也必须分叉。
  • 是的!正确,我可以管理诸如sort < txtFile | grep key 之类的命令,但是当我有多个管道时,我真的不知道如何处理这个问题,就像我上面发布的示例命令一样。

标签: c shell pipe


【解决方案1】:

如果您确实让除了多个管道之外的所有东西都正常工作,您可以使用分组或子外壳将它们减少为单个管道。

{ ls -l -a -F | tr a-z A-Z; } | sort
(ls -l -a -F | tr a-z A-Z) | sort

【讨论】:

    【解决方案2】:

    只需按顺序解析字符串,当您到达管道符号时,您会分叉最后一个命令并将标准输入和标准输出存储起来。如果您有一个先前的命令,您可以将该命令标准输出到新命令的标准输入。然后你循环。


    补充说明:

    唯一的区别

    A)    thing1 > thing2
    

    B)    thing1 | thing2
    

    这是吗,在 A 中)您正在运行 thing1(使用 fork)并将输出设置为名为 thing2 的文件

    在 B) 中,您使用 fork 运行 thing1 和 thing2,并将 thing1 的输出设置为 thing2 的输入。

    所以,

    C)     thing1 | thing2 | thing3
    

    同理,你需要运行(fork)thing1、thing2、thing3并将thing1的输出设置为thing2的输入,将thing2的输出设置为thing3的输入。

    Pipe 的工作方式与 > 类似,但您使用 fork 运行“目标”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多