如何将'ls'(或任何其他shell命令)的输出重定向到管道?

时间:2014-03-05 10:22:14

标签: c++ c bash shell

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

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

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

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

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

ls > ls_out.txt

但我无法使用execl重现该内容。

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在您的计划中创建pipe

做叉子。

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

执行您要运行的程序。

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

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

答案 2 :(得分:0)

你似乎很关注exec();该调用用于运行进程。必须事先设置管道,因为您要启动的过程将只使用已存在的stdin / stdout。有关低级基元,请参阅fork()dup()pipe()

答案 3 :(得分:0)

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

for ls -1; echo $ i;完成了

ls -1 | xargs echo