使用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);