2010-01-15 60 views
3

當通過xcode運行下面的代碼時,我得到不一致的行爲。有時它會正確打印git版本,有時它不會打印任何內容。雖然shell命令的返回碼始終爲0。任何想法,爲什麼這可能是?我究竟做錯了什麼?使用popen()來調用shell命令?

 

#define BUFFER_SIZE 256 
int main (int argc, const char * argv[]) 
{ 
    FILE *fpipe; 
    char *command="/opt/local/bin/git --version"; 
    char line[BUFFER_SIZE]; 

    if (!(fpipe = (FILE*)popen(command, "r"))) 
    { // If fpipe is NULL 
     perror("Problems with pipe"); 
     exit(1); 
    } 

    while (fgets(line, sizeof(char) * BUFFER_SIZE, fpipe)) 
    { 
     // Inconsistent (happens sometimes) 
     printf("READING LINE"); 
     printf("%s", line); 
    } 

    int status = pclose(fpipe); 

    if (status != 0) 
    { 
     // Never happens 
     printf("Strange error code: %d", status); 
    } 

    return 0; 
} 
 

回答

1

我想我已經找到了奇怪行爲的來源。看起來Xcode在內置的終端窗口中做了一些奇怪的事情,導致我看不到輸出。如果我試圖直接在標準終端窗口中運行代碼,則不會顯示此行爲,並且文本始終打印出來。

+0

現在你提到它了,我在eclipse上遇到了這個問題 - 在eclipse中它是一個缺失的flush – 2010-01-16 14:31:22

+0

有趣的是,我嘗試添加fflush,但它似乎沒有幫助 - 可能只是我做錯了,但你可能會指出我在哪一行添加fflush? – Anvar 2010-01-16 18:00:38

+0

看來,在eclipse終端窗口中,最後一個如果不在printf語句的末尾添加換行符(\ n),則不顯示輸出行。 – 2013-11-21 11:21:54

1

這聽起來很像彷彿輸出緩衝,你有沒有考慮沖洗輸出buffer..use fflush()這樣做。有關更多信息,請參閱here

希望這會有所幫助, 最好的問候, 湯姆。

+0

我原本是在我的代碼中,但決定刪除它之前粘貼它在這裏:)雖然似乎沒有幫助,雖然:( – Anvar 2010-01-15 15:54:33

+0

在我看來,這是爲父母程序輸出數據時fflush()在這種情況下必須在git端完成,通常程序員會忽略這一點,因爲當一個進程關閉操作系統刷新所有緩衝區時 – 2010-01-15 15:54:33