【问题标题】:Is it possible to redirect stdout to two places in C?是否可以将标准输出重定向到 C 中的两个地方?
【发布时间】:2014-07-17 14:29:32
【问题描述】:

我已经被这个问题困扰了一段时间,是否可以将标准输出重定向到两个不同的地方?我正在编写自己的 shell 进行练习,它目前可以运行像 ps aux | wc -lps aux | wc -l > output.file 这样的命令。但是,当我尝试运行ps aux > file.out | wc -l 时,第二个命令没有收到第一个命令的输入。

在最后一个示例中,第一个命令将在子进程中运行,该子进程将输出到管道的一端。逻辑类似如下:

close(stdout);
dup2(fd[1], STDOUT_FILENO);

//If a file output is also found
filewriter = open(...);
dup2(filewriter, STDOUT_FILENO);

//Execute the command

【问题讨论】:

    标签: c unix pipe dup2


    【解决方案1】:

    普通的 UNIX shell 也不能使用这种语法。 UNIX(和其他一些操作系统)提供tee[1] 命令将输出发送到文件,还提供stdout

    示例: ps aux | tee file.out | wc -l

    [1] 见http://en.wikipedia.org/wiki/Tee_(command)

    【讨论】:

    • 有一个相关的概念叫做named pipe,它有时也很有用,它可以让你创建一个特殊的文件,它是命名管道,可以让你用进程间做一些非常有用的事情沟通。如果您想了解更多信息:en.wikipedia.org/wiki/Named_pipe
    • 好的,我去看看。
    • 有趣。从未使用过它,自 1992 年左右以来一直坚持使用 ksh(在此之前是 csh,但从那以后就没有了,并且一旦它建立了 bash),因为我处理的大部分内容都是用它编写的。我去看看。
    • 请注意,zsh 文档中说:如果用户尝试打开文件描述符进行多次写入,shell 会打开文件描述符作为通往复制其文件的进程的管道。输入到所有指定的输出,类似于tee,...(对于多个输入和cat 有类似的注释)。这是一个有趣的设计,让 shell 隐式创建额外的进程。通常,shell 只会创建您指定的进程。
    【解决方案2】:

    tee 命令在 UNIX 中就是这样做的。要了解如何在 C 语言中执行此操作,为什么不查看 tee's source code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2023-04-02
      • 2012-05-28
      相关资源
      最近更新 更多