2013-04-21 150 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