3.31.2014

Linux的sysinfo()函式

最近在看廠商的源始碼,注意到一個很有意思的函數:sysinfo()。想把這個函數給記錄下來;因為裡面所提供的資訊多多少少都有點用處。

功能說明:取得Linux系統的一些訊息。

標頭檔:#include <sys/sysinfo.h>

函式宣告:int sysinfo(struct sysinfo *info);

函式說明:
1. sysinfo()所傳進去的參數是一個struct sysinfo的結構指標;struct sysinfo結構的內容如範例所示。要使用這個函數時有些限制:Linux版本至少為2.3.23 (i386),或者是2.3.48 (x64)
2. 那struct sysinfo的結構內容為何?? 當我們查詢:/ usr / include / sys / sysinfo.h,發現它定義在:/ usr / include / linux / kernel.h
struct sysinfo {
 long uptime;             // Seconds since boot
 unsigned long loads[3];  // 1, 5, and 15 minute load averages
 unsigned long totalram;  // Total usable main memory size 
 unsigned long freeram;   // Available memory size
 unsigned long sharedram; // Amount of shared memory
 unsigned long bufferram; // Memory used by buffers
 unsigned long totalswap; // Total swap space size
 unsigned long freeswap;  // swap space still available
 unsigned short procs;    // Number of current processes
 unsigned short pad;      // explicit padding for m68k
 unsigned long totalhigh; // Total high memory size 
 unsigned long freehigh;  // Available high memory size
 unsigned int mem_unit;   // Memory unit size in bytes
 char _f[20 - 2 * sizeof(long) - sizeof(int)]; // Padding: libc5 uses this...
};
回傳值:執行成功返回0,失敗返回-1;errno被設定為EFAULT。

範例:
#include <stdio.h>
#include <string.h>
#include <sys/sysinfo.h>
#include <stdlib.h>

int main(int argc, char *argv[], char **envp)
{
 struct sysinfo stSysinfo;
 int error = 2;

 memset(&stSysinfo, 0, sizeof(struct sysinfo));
 error = sysinfo(&stSysinfo);
 if (error == -1) {
  perror("sysinfo");
  printf("strerror(%d): %s \n", errno, strerror(errno));
  exit(1);
 }
 
 printf("stSysinfo.uptime: %ld \n", stSysinfo.uptime);
 printf("stSysinfo.loads[0]: %lu \n", stSysinfo.loads[0]);
 printf("stSysinfo.loads[1]: %lu \n", stSysinfo.loads[1]);
 printf("stSysinfo.loads[2]: %lu \n", stSysinfo.loads[2]);
 printf("stSysinfo.totalram: %lu \n", stSysinfo.totalram);
 printf("stSysinfo.freeram: %lu \n", stSysinfo.freeram);
 printf("stSysinfo.sharedram: %lu \n", stSysinfo.sharedram);
 printf("stSysinfo.bufferram: %lu \n", stSysinfo.bufferram);
 printf("stSysinfo.totalswap: %lu \n", stSysinfo.totalswap);
 printf("stSysinfo.freeswap: %lu \n", stSysinfo.freeswap);
 printf("stSysinfo.procs: %u \n", stSysinfo.procs);
 printf("stSysinfo.pad: %u \n", stSysinfo.procs);
 printf("stSysinfo.totalhigh: %lu \n", stSysinfo.totalhigh);
 printf("stSysinfo.freehigh: %lu \n", stSysinfo.freehigh);
 printf("stSysinfo.mem_unit: %u \n", stSysinfo.mem_unit);
 printf("stSysinfo._f[%d]: %s \n ", 20 - 2 * sizeof(long) - sizeof(int), stSysinfo._f[20 - 2 * sizeof(long) - sizeof(int)]);

 return 0;
}
執行結果:


仔細看,它跟cat -n / proc / meminfo | less裡的內容非常類似....

沒有留言:

張貼留言