2011-05-12 151 views
3

我在C語言中執行shell命令時遇到了問題。我想在C中執行shell命令,然後捕獲shell命令的輸出並進一步處理輸出。我使用下面的代碼來執行功能。但是,問題是當shell命令不會返回任何輸出時,fgets()會返回垃圾信息?例如,如果/ etc/version包含','分隔值,shell返回輸出,fgets返回shell命令返回的值,但是當/ etc/version不包含','時,分離的值,shell不返回任何值,fgets返回垃圾信息。有沒有解決這個問題的方法,或者是否有任何其他解決方案在C和capture shell命令輸出中執行shell命令?如何在C中執行shell命令?

char return_val[256]; 
FILE *fp = NULL; 
char line[256]; 
memset (return_val, 0, 256); 
/* set the defalut value */ 
strncpy (return_val, "N/A", 4); 
char cmd[] = "if [ -f /etc/umts2100_version ]; then cut -d, -f1 -s /etc/umts2100_version ; fi"; 

/* Open the command for reading. */ 
fp = popen(cmd, "r"); 
if (fp != NULL) 
{ 
    /* read the line from file */ 
    fgets (line, 256, fp); 
    if(line != NULL) 
    { 
      /* copy the data */ 
      strncpy(return_val, line, strnlen (line, 256)); 
     } 
     /* close the file */ 
    pclose (fp); 
} 

回答

2

您需要檢查fgets的返回值。您正在測試的指針永遠不會爲NULL,因爲Fgets不會更改其參數。

if (fgets (line, 256, fp) == NULL) { 
    // read failed 
} 
+0

嗨,我試着你有什麼建議。建議解決方案的問題是,如果流的字節數小於255(考慮它只有2個字節),則fgets返回NULL,但將2個字節的內容複製到行中。如果我錯了,請糾正我。 – Ravi 2011-05-12 12:54:48

+0

@Ravi這兩個字節是一行嗎?換句話說,他們最終是否有\ n?如果不是,你可能不得不用fread或fgetc而不是fgets來讀取流。 – 2011-05-12 13:27:33

+0

感謝您的回覆。在線的末尾我不認爲\ n存在。 fp到達文件結尾,這就是原因,fgets()返回NULL。我認爲fgetc()是更好的選擇。 – Ravi 2011-05-13 06:37:16