2012-03-24 106 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在每次輸出操作後設置數據流刷新。有許多其他方法可以自動刷新,但這些方法會涉及更多。