我想在ifstream
中获取shell执行的输出,但是问题是程序永远不会终止,所以我不能使用popen()
。我必须获取各种工具的输出,但一个例子是ping
。所以我要么以某种方式停止在管道中运行的程序,以便popen()
返回字符串或者有一些方法(我还不知道)来传输输出。我知道我可以使用system()
,将输出定向到一个文件并将其流入。但我肯定更喜欢某种直接方法,如果有的话。
有人知道将自调用的正在运行的程序的Linux shell输出流式传输到ifstream
或类似内容的方法吗?
答案 0 :(得分:2)
popen
和C ++流使用基本的Linux system calls,这些列在syscalls(2)中,其中大多数都在Advanced Linux Programming中解释。
如果您只有一个子命令进程无限期运行,我相信您可以使用popen(3)。
如果您希望一次读取多个管道(例如,一次运行多个子进程),或者您需要同时激活子进程和您自己的进程,事情会变得更加复杂。
然后您将设置管道(请参阅pipe(7)& pipe(2)),然后设置fork(2)子进程等(您还需要dup2
,{ {1}},waitpid
或execve
等...)然后您需要一个多路复用系统调用,例如我推荐的poll(2)或更早的select(2)等。 ..(为了完整性,另请参阅epoll(7)并阅读C10K problem)。
然后你需要一些event loop(执行execvp
),你可以使用一些现有的库(libev,libevent等... )。如果您正在编写GUI应用程序(例如使用Qt或Gtk),则应使用其事件循环机制及其子进程支持(均由大多数GUI工具包提供)。
解释所有细节会花费我太多时间; Advanced Linux Programming正在很好地解释它们。
您可能需要strace(1)一些命令或进程来了解所涉及的系统调用。
答案 1 :(得分:1)
我在这篇文章中找到了最符合我需求的答案:
How to execute a command and get output of command within C++ using POSIX?
pstreams
图书馆可以解决这个问题所需的一切: