2013-04-21 135 views
7

我有下面的代碼我指上here線程使用popen函數Linux命令

int main(int argc,char *argv[]){  
    FILE* file = popen("ntpdate", "r"); 
    char buffer[100]; 
    fscanf(file, "%100s", buffer); 
    pclose(file); 
    printf("buffer is :%s\n", buffer); 
    return 0; 
} 

它輸出:

21 Apr 03:03:03 ntpdate[4393]: no server can be used, exiting 
buffer is: 

爲什麼printf不輸出什麼?如果我使用ls作爲命令,那麼printf會輸出ls輸出。我在做什麼錯誤ntpdate執行?

如果我執行下面的代碼(指的webpage

#define COMMAND_LEN 8 
#define DATA_SIZE 512 

int main(int argc,char *argv[]){ 


    FILE *pf; 
     char command[COMMAND_LEN]; 
     char data[DATA_SIZE]; 

     // Execute a process listing 
     sprintf(command, "ntpdate"); 

     // Setup our pipe for reading and execute our command. 
     pf = popen(command,"r"); 

     if(!pf){ 
     fprintf(stderr, "Could not open pipe for output.\n"); 
     return; 
     } 

     // Grab data from process execution 
     fgets(data, DATA_SIZE , pf); 

     // Print grabbed data to the screen. 
     fprintf(stdout, "-%s-\n",data); 

     if (pclose(pf) != 0) 
      fprintf(stderr," Error: Failed to close command stream \n"); 

     return 0; 
} 

我得到

21 Apr 03:15:45 ntpdate[5334]: no servers can be used, exiting 
-�2}�����"|�4#|�- 
Error: Failed to close command stream 

什麼上面代碼過錯?

+1

如果我們這樣做'用ntpdate 2>的/ dev/null'我們可以看到,所以你需要它使用'stderr'重定向'stderr'來查看輸出 – 2013-04-21 01:24:53

回答

14

由於輸出是要stderr你需要重定向stderr像這樣:

FILE* file = popen("ntpdate 2>&1", "r"); 

這將重定向到stderrstdout所以你會看到兩個輸出。第二個問題fscanf將停在第一個空間,這樣你就可以fgets取代:

fgets(buffer, 100, file); 
+0

它只輸出'buffer is:21',服務器在/ etc/ntp.conf中定義。如果我使用'FILE * file = popen(「ntpdate 79.99.6.190 2>&1」,「r」);'79.99.6.190是http://www.pool.ntp.org/的ntp服務器。我錯過了什麼嗎?這是我如何使用代碼http://pastebin.com/8g77zRF0 – sven 2013-04-21 01:46:48

+0

我不知道它是否正常工作在你身邊? – sven 2013-04-21 01:58:00

+0

@sven剛剛更新了答案,我錯過了fscanf問題 – 2013-04-21 01:58:48

2

由於Shafik Yaghmour正確診斷,您從ntpdate看到的輸出寫入(正確)到其標準錯誤,這與您的程序標準錯誤相同。

爲了獲取發送沿管路的錯誤信息,使用方法:

FILE *file = popen("ntpdate 2>&1", "r"); 

發送該標準錯誤輸出從ntpdate到命令的標準輸出,這是你從閱讀管。

當然,它看起來像使用ntpdate是不會很好,直到你配置了一些東西。

1
FILE *popen(const char *command, const char *type); 
+1

嗨,你好,歡迎來到[so]。你爲什麼寫同一條線兩次?你能解釋一下你的答案,以便對別人更有幫助嗎?您可以點擊帖子下方的* [edit] *鏈接更新答案。謝謝。 – Pang 2017-04-20 04:21:07