如何在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中 

     /* Thu Jan  1 02:02:37 UTC 1970 */  //舉例,輸出的時間格式爲這個
    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);











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章