2012-03-24 107 views
1

我想从shell命令(my_program)获取输出。下面是从this网站采取了例如:永久获取以C++运行的shell命令的输出

#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; 
} 

问题:

我要永久运行了一个程序,得到的输出,而程序仍在运行,不仅能获得从输出编程一次。

有什么想法?

谢谢先进。

+0

1)打开三个管道,2)分叉,3)'dup2'和微动文件描述符,4)'exec'在孩子中。 – 2012-03-24 20:32:46

+0

你的问题不是很清楚 - 你是什么意思的'永久'?为什么不让'my_program'永久运行? – trojanfoe 2012-03-24 20:41:19

+0

@KerrekSB,我已经想过使用fork/threads。但想知道是否有另一个可选项。感谢您的回答。 – 2012-03-24 20:47:47

回答

0

你的问题是有些不清楚,但我怀疑问题是缓冲区和答案潮红:我理解的方式是偶尔程序my_program产生的输出,并告诉你应该踢成行动时,my_program打印出一些东西的节目。此外,我怀疑这个程序不会产生大量的输出,例如小于4k。

问题是,大多数实现缓冲标准输出的方式取决于它是指向“控制台”还是其他地方:写入控制台输出时往往是行缓冲区,而其他目标缓冲区显着更大的缓冲区。但是,缓冲区可以明确刷新,从而大大降低了输出的性能。当然,在上面的情景中,你会更关心及时的产出而不是产出表现。

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