linux命令由popen在C代码上执行

前端之家收集整理的这篇文章主要介绍了linux命令由popen在C代码上执行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有下面的代码,我在 here上引用线程来使用popen函数
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

上面的代码有什么错误

解决方法

由于输出是stderr,你需要像这样重定向stderr:
FILE* file = popen("ntpdate 2>&1","r");

这会将stderr重定向到stdout,因此您将看到两者的输出.第二个问题fscanf将在第一个空格处停止,因此您可以使用fgets替换:

fgets(buffer,100,file);

猜你在找的Linux相关文章