2013-04-21 27 views
7

Tôi có đoạn code dưới đây mà tôi tham khảo các chủ đề trên here sử dụng popen chức nănglệnh linux thực hiện bởi popen trên mã C

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; 
} 

Nó ra:

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

tại sao printf không đầu ra có gì không? Nếu tôi sử dụng ls làm lệnh, khi đó printf sẽ xuất kết quả đầu ra ls. Tôi đang làm gì sai khi thực hiện?

Nếu tôi thực thi mã dưới đây (ám chỉ các 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; 
} 

tôi nhận được

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

là gì sai lầm trên các mã trên?

+1

Nếu chúng ta làm 'ntpdate 2>/dev/null' chúng ta có thể thấy rằng nó được sử dụng' stderr' vì vậy bạn cần để chuyển hướng 'stderr' để xem đầu ra –

Trả lời

14

Kể từ khi đầu ra sẽ stderr bạn cần phải chuyển hướng stderr như vậy:

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

này sẽ chuyển hướng stderr để stdout và do đó bạn sẽ thấy đầu ra từ cả hai. Thứ hai vấn đề fscanf sẽ dừng lại ở không gian đầu tiên, do đó bạn có thể thay thế với fgets:

fgets(buffer, 100, file); 
+0

nó xuất ra chỉ' bộ đệm là: 21' ở đây, các máy chủ được định nghĩa trên '/ etc/ntp.conf'. nếu tôi sử dụng 'FILE * file = popen (" ntpdate 79.99.6.190 2> & 1 "," r ");' rằng 79.99.6.190 là một máy chủ ntp của http://www.pool.ntp.org/. tui bỏ lỡ điều gì vậy? đây là cách chính xác tôi sử dụng mã http://pastebin.com/8g77zRF0 – sven

+0

Tôi tự hỏi nếu nó làm việc tốt về phía bạn? – sven

+0

@sven chỉ cần cập nhật câu trả lời, tôi đã bỏ lỡ vấn đề fscanf –

2

Shafik Yaghmour được chẩn đoán chính xác, kết quả bạn thấy từ ntpdate được viết (chính xác) đến lỗi chuẩn của nó, giống như lỗi chuẩn của chương trình.

Để có được các thông báo lỗi gửi xuống các đường ống, sử dụng:

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

đó gửi kết quả sai số chuẩn từ ntpdate đến đầu ra tiêu chuẩn của lệnh, đó là ống bạn đang đọc từ.

Tất nhiên, có vẻ như việc sử dụng ntpdate sẽ không hoạt động tốt cho đến khi bạn định cấu hình điều gì đó.

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

Xin chào, chào mừng bạn đến [như vậy]. Tại sao bạn viết cùng một dòng hai lần? Bạn có thể giải thích câu trả lời của bạn để nó có thể hữu ích hơn cho người khác không? Bạn có thể cập nhật câu trả lời của mình bằng cách nhấp vào liên kết * [chỉnh sửa * bên dưới bài đăng. Cảm ơn. – Pang

Các vấn đề liên quan