c++ - 从在 C++ 中运行的 shell 命令永久获取输出

标签 c++ popen

我想获得 shell 命令 (my_program) 的输出。这是取自 this 的示例网站:

#include <iostream>
#include <stdio.h>

using namespace std;

int main() {
   FILE *in;
   char buff[512];

   if(!(in = popen("my_program", "r"))){
      return 1;
   }

   while(fgets(buff, sizeof(buff), in)!=NULL){
      cout << buff;
   }
   pclose(in);

   return 0;
}

问题:

我想永久运行我的程序并在程序仍在运行时获取输出,而不仅仅是从程序中获取一次输出。

有什么想法吗?

最佳答案

你的问题有点不清楚,但我怀疑问题出在缓冲区和答案刷新:我的理解是程序my_program偶尔会产生输出,您显示的程序应该在 my_program 时开始运行打印一些东西。此外,我怀疑这个程序总共不会产生很多输出,例如小于 4k。

问题是大多数实现缓冲标准输出的方式不同,这取决于它是定向到“控制台”还是其他东西:当写入控制台时,输出往往是行缓冲区,而其他目的地缓冲大得多的缓冲区。但是,可以显式刷新缓冲区,从而大大降低输出的性能。当然,在上面的场景中,您更感兴趣的是及时输出而不是输出性能。

在 C++ 中刷新输出缓冲区的简单方法我们使用 out << std::flush .如果你想快速验证这个问题,你可以使用 out << std::unitbuf 将流设置为在每次输出操作后刷新。 .还有许多其他方法可以自动刷新,但这些方法涉及更多。

关于c++ - 从在 C++ 中运行的 shell 命令永久获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855312/

相关文章:

python - 尝试避免在 Python 子进程中使用 shell=True

c - Popen 和 execl 未给出用户定义程序的输出

c - 为什么 pclose(3) 不等待 shell 命令终止

php - 在 javascript/HTML5 应用程序之外获取变量

c++ createprocess powershell as admin,隐藏并且不要等待它

c++ - 非阻塞 TCP 套接字并在发送后立即刷新?

C++:如何为任意函数调用实现超时?

c++ - 为什么 NULL 被转换成 string*?

没有控制台的 C++ popen 命令

python - 从 Python 脚本运行时找不到 Nmap