天天看点

如何在C代码中读取终端命令执行结果输出

使用shell脚本或命令,可以很方便的获取到我们需要的信息。因此,有“一条shell命令顶100行代码”之说。比如free,本身是busybox中的关于内存操作的C代码编译出来的可执行命令。如果在我们自己写的代码中要集成这个功能,把代码移过来是一种方式,但是少不了的是工作量。如果是复杂的命令,还得费点周折。如果能直接读到命令执行结果,这可以减少工作量。

要实现这样的功能,大概有一下几步:

1、popen(cmd), cmd是要执行的命令。

2、将popen执行的结果保存到一个stream里面。

3、使用sscanf或者使用fscanf从结果中提取想要的字段。

以获取系统时间为例给出一段代码:

  FILE *output;

  char *script,

  FILE *wstream;

  script =  "date";

  output = popen(script, "r");

//-----------------------------分割线------------------------------------------------------//

    wstream = fopen( "radio_time.txt", "w+"); //新建一个可写的文件

    fread( buf, sizeof(char), sizeof(buf), output); //将数据流读取到buf中 

       //举例,输出的时间格式为这个

    sscanf(buf, "%s %s %d %2d:%2d:%2d %*s %4d", tm_wday, tm_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec, &tm_year); //%*s表示忽略该字段

    printf("time is  %4d-%s-%d-%2d:%2d:%2d\n", tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec); 

    fwrite( buf, 1, sizeof(buf), wstream );//将buf中的数据写到FILE *wstream对应的流中,也是写到文件中

    pclose( output );

    fclose( wstream ); 

//------------------------------END--------------------------------------------------------//

对output可以用fscanf提取,因此以上分隔线中的代码有另外一种写法:

  while ( !(feof(output) )) {

    fscanf(output, "%s %s %d %2d:%2d:%2d %*s %4d", tm_wday, tm_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec, &tm_year); //%*s表示忽略该字段

    while (('\n' != fgetc(output)) && !feof(output)) {}

  }

pclose(output);