在c ++

时间:2015-06-17 12:28:04

标签: c++ linux shell

我想在ifstream 中获取shell执行的输出,但是问题是程序永远不会终止,所以我不能使用popen()。我必须获取各种工具的输出,但一个例子是ping。所以我要么以某种方式停止在管道中运行的程序,以便popen()返回字符串或者有一些方法(我还不知道)来传输输出。我知道我可以使用system(),将输出定向到一个文件并将其流入。但我肯定更喜欢某种直接方法,如果有的话。

有人知道将自调用的正在运行的程序的Linux shell输出流式传输到ifstream或类似内容的方法吗?

2 个答案:

答案 0 :(得分:2)

popen和C ++流使用基本的Linux system calls,这些列在syscalls(2)中,其中大多数都在Advanced Linux Programming中解释。

如果您只有一个子命令进程无限期运行,我相信您可以使用popen(3)

如果您希望一次读取多个管道(例如,一次运行多个子进程),或者您需要同时激活子进程和您自己的进程,事情会变得更加复杂。

然后您将设置管道(请参阅pipe(7)& pipe(2)),然后设置fork(2)子进程等(您还需要dup2,{ {1}},waitpidexecve等...)然后您需要一个多路复用系统调用,例如我推荐的poll(2)或更早的select(2)等。 ..(为了完整性,另请参阅epoll(7)并阅读C10K problem)。

然后你需要一些event loop(执行execvp),你可以使用一些现有的库(libevlibevent等... )。如果您正在编写GUI应用程序(例如使用QtGtk),则应使用其事件循环机制及其子进程支持(均由大多数GUI工具包提供)。

解释所有细节会花费我太多时间; Advanced Linux Programming正在很好地解释它们。

您可能需要strace(1)一些命令或进程来了解所涉及的系统调用。

答案 1 :(得分:1)

我在这篇文章中找到了最符合我需求的答案:

How to execute a command and get output of command within C++ using POSIX?

pstreams图书馆可以解决这个问题所需的一切:

http://pstreams.sourceforge.net/