【问题标题】:How to redirect the output of 'ls' (or any other shell command) to a pipe?如何将'ls'(或任何其他shell命令)的输出重定向到管道?
【发布时间】:2014-03-05 10:22:13
【问题描述】:

我的任务是用 C 语言编写一个打开管道的程序,然后其中一个进程执行 ls 命令并将输出写入管道。然后其他进程应该读取它并将其显示在 shell 中。

所以,我正在努力解决的主要问题是:

execl("/bin/ls", "/bin/ls", NULL);

如何将输出重定向到管道?

我尝试做的另一种方法是将输出重定向到文件,读取文件,然后将其写入管道,最后在另一端读取它(并删除文件)。 在这样的外壳中:

ls > ls_out.txt

但我无法用 execl 重现它。

当然,我最喜欢的解决方案仍然是:

execl("/bin/ls", "bin/ls", " > my_pipe", NULL)

【问题讨论】:

    标签: c++ c bash shell


    【解决方案1】:

    使用 popen() 而不是 execl() 来读取应用程序输出,参见http://linux.die.net/man/3/popen

    【讨论】:

      【解决方案2】:

      在你的程序中创建一个pipe

      做叉子。

      在子进程中,将管道的写入端设为新的STDOUT_FILENO。 (阅读dup2系统调用)

      执行你要运行的程序。

      在父进程中从管道的读取端读取。

      这就是例如popen 在幕后工作。

      【讨论】:

        【解决方案3】:

        你似乎很关注exec();该调用用于运行进程。必须事先设置管道,因为您要启动的进程将只使用已经存在的任何标准输入/标准输出。有关低级原语,请参阅 fork()dup()pipe()

        【讨论】:

          【解决方案4】:

          我想这可能就是您要找的东西?

          对于我在ls -1;回声 $i;完成了

          ls -1 | xargs 回显

          ?

          【讨论】:

            猜你喜欢
            • 2013-12-21
            • 2013-10-23
            • 1970-01-01
            • 1970-01-01
            • 2018-02-28
            • 2021-10-24
            • 2023-03-30
            • 2020-10-08
            • 1970-01-01
            相关资源
            最近更新 更多