2016-05-08 115 views
0

任何人都知道我可以解決這個問題嗎?C - popen沒有顯示正確的輸出

char bash_cmd[256] = "curl"; 
char buffer[1000]; 
FILE *pipe; 
int len; 

pipe = popen(bash_cmd, "r"); 


if (NULL == pipe) { 
    perror("pipe"); 
    exit(1); 
} 
fgets(buffer, sizeof(buffer), pipe); 
printf("OUTPUT: %s", buffer); 
pclose(pipe); 

上面的代碼片段將返回以下內容:

OUTPUT: (�3B 

,而不是這是它應該返回:

curl: try 'curl --help' or 'curl --manual' for more information 

東西是錯的,我想不出什麼。當我用「ls -la」代替「curl」時,它可以正常工作,但是無論什麼原因,只有當我使用curl時,它纔會正確地將輸出保存到緩衝區中。我能做些什麼來解決這個問題?在此先感謝

另外,用捲曲完整路徑(/ usr/bin/curl)替換「捲曲」也不起作用。 (

+1

首先,您未能檢查函數的返回值。 –

回答

1

當我運行你的代碼時,我發現輸出確實與你描述的大致相同,但是你期望的輸出是也是之前打印過的,因此看起來很有可能是curl正在打印他使用消息到它的stderr而不是它的stdout,事實上它應該這樣做。

您不檢查返回值fgets();我懷疑你會發現它是NULL,表示在讀取任何數據之前流的結束髮生。在這種情況下,我不認爲fgets()會修改提供的緩衝區。

如果你想捕捉除了curlstderrstdout,那麼你可以申請I/O重定向的問題:

char bash_cmd[256] = "curl 2>&1"; 

這不會與execve() - 家庭工作(直接)函數,但popen()通過shell運行給定的命令,該shell應該很好地處理重定向操作符。

但是,對於一般用途,結合curl的輸出和錯誤流可能不是您想要的。如果真實的輸出和真實的診斷都被排出,那麼它們會混合在一起。

+0

這解決了它。謝謝 – BradyUnger

+0

我的答案重複:( – augurar

0

curl期望的輸出是要stderrstdout其實沒有數據被寫入到stdout要打印的輸出緩衝區的初始化內容

您的代碼應該檢查返回。值爲fgets,如果沒有讀取字符(或發生錯誤),它將爲空。