Linux C語言獲取系統信息

/*
  * =====================================================================================
  *
  *       Filename:  proc_more.c
  *
  *    Description:  
  *
  *        Version:  1.0
  *        Created:  2013年08月07日 11時34分40秒
  *       Revision:  none
  *       Compiler:  gcc
  *
  *         Author:  linkscue (scue), [email protected]
  *   Organization:  
  *
  * =====================================================================================
  */
 
 #include <stdio.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <string.h>
 void sampleLoadAvg(){
     int f=0;
     char buffer[80]="";                         /* 定義字符串並初始化爲'\0' */
     char buf[5][10];
     char *file="/proc/loadavg";
     f = open(file, O_RDONLY);
     if (f == 0)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     read(f, (void *)buffer, 80);
     sscanf(buffer, "%s %s %s %s %s",            /* sscanf()拆分成多個字符串 */
             &buf[0],&buf[1],&buf[2],&buf[3],&buf[4]);
     printf("一分鐘平均負載:%s\n", buf[0]);
     printf("五分鐘平均負載:%s\n", buf[1]);
     printf("一刻鐘平均負載:%s\n", buf[2]);
     printf("採樣時刻的間隔:%s\n", buf[3]);
     printf("最大線程的數目:%s\n", buf[4]);
     close(f);
 }
 void sampleTime(){
     int f=0;
     char buffer[80]="";
     char buf[2][10];
     float seconds=0;
     float secondr=0;
     char *file="/proc/uptime";
     f = open(file, O_RDONLY);
     if (f == 0)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     read(f, (void *)buffer, 80);
     sscanf(buffer, "%s %s", &buf[0], &buf[1]);
     close(f);
     printf("系統運行時間:\t%s秒\n", buf[0]);
     printf("系統空閒時間:\t%s秒\n", buf[1]);
     close(f);
     seconds=strtof(buf[0],NULL);
     secondr=strtof(buf[1],NULL);
     printf("系統運行時間:\t%03d天%02d時%02d分%02.6f秒\n", 
             (int)seconds/(24*3600),             /* 天 */
             ((int)seconds/(3600))%(24),         /* 時 */
             ((int)seconds/60)%60,               /* 分 */
             ((int)seconds%60)+(seconds-(int)seconds)); /* 秒(精確至毫秒) */
     printf("系統空閒時間:\t%03d天%02d時%02d分%02.6f秒\n", 
             (int)secondr/(24*3600),             /* 天 */
             ((int)secondr/(3600))%(24),         /* 時 */
             ((int)secondr/60)%60,               /* 分 */
             ((int)secondr%60)+(secondr-(int)secondr)); /* 秒(精確至毫秒) */
 }
 
 void sampleKernelVersion(){
     int f=0;
     char buffer[80]="";
     char *file="/proc/sys/kernel/version";
     f = open(file, O_RDONLY);
     if (f == 0)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     read(f, (void *)buffer, 80);
     buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
     printf("當前內核版本:\t%s\n", buffer);
     close(f);
 }
 
 void sampleOsRelease(){
     int f=0;
     char buffer[80]="";
     char *file="/proc/sys/kernel/osrelease";
     f = open(file, O_RDONLY);
     if (f == 0)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     read(f, (void *)buffer, 80);
     buffer[strlen(buffer)-1]=0;
     printf("當前發行版本:\t%s\n", buffer);
     close(f);
 }
 
 void sampleOsType(){
     int f=0;
     char buffer[80]="";
     char *file="/proc/sys/kernel/ostype";
     f = open(file, O_RDONLY);
     if (f == 0)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     read(f, (void *)buffer, 80);
     buffer[strlen(buffer)-1]=0;
     printf("當前操作系統:\t%s\n", buffer);
     close(f);
 }
 
 void sampleDiskStat(){
     int i;
     FILE *fp;
     int nread=0;
     ssize_t len = 0;
     char *buffer=NULL;
     char buf[20][32];
     char *file="/proc/diskstats";
     char *p;
     fp = fopen(file, "rb");
     if (fp == NULL)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     printf("  磁盤  讀次數  寫次數\n");
     while((nread = getline(&buffer, &len, fp)) != -1) { /* 簡單實現讀行的功能 */
         sscanf(buffer, "%04s%08s%s %s %s %s %s %s %s %s %s %s %s %s", 
                 &buf[0],&buf[1],&buf[2],&buf[3],&buf[4],&buf[5],&buf[6],
                 &buf[7],&buf[8],&buf[9],&buf[10],&buf[11],&buf[12],&buf[13]);
         if ((p=strstr(buf[2], "loop"))!=NULL)
         {
             ;                                   /* loop本地迴路不作操作 */
         }
         else {
             printf("%06s%08s%08s\n", 
                     &buf[2],&buf[3], &buf[7]);
         }
     }
 }
 
 void sampleProcesses(void)
 {
     FILE *fp;
     int nread=0;
     ssize_t len = 0;
     char *buf=NULL;
     char *buffer=NULL;
     char *file="/proc/stat";
     fp = fopen(file, "rb");
     if (fp == NULL)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     while((nread = getline(&buffer, &len, fp)) != -1) {
         if((buf=strstr(buffer, "processes"))!=NULL)  /* 簡單實現grep的功能 */
             break;
     }
     buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
     char count[16]="";
     sscanf(buffer, "%s%s", count, count);
     printf("執行線程數目:\t%s\n", count);
 }
 
 void sampleContext(void)
 {
     FILE *fp;
     int nread=0;
     ssize_t len = 0;
     char *buf=NULL;
     char *buffer=NULL;
     char *file="/proc/stat";
     fp = fopen(file, "rb");
     if (fp == NULL)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     while((nread = getline(&buffer, &len, fp)) != -1) {
         if((buf=strstr(buffer, "ctxt"))!=NULL)  /* 簡單實現grep的功能 */
             break;
     }
     buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
     char count[16]="";
     sscanf(buffer, "%s%s", count, count);
     printf("上下文切換次數:\t%s\n", count);
 }
 
 void sampleMeminfo()
 {
     FILE *fp;
     int nread=0;
     ssize_t len = 0;
     char *buf=NULL;
     char *buffer=NULL;
     char *file="/proc/meminfo";
     char content[16]="";
     fp = fopen(file, "rb");
     if (fp == NULL)
     {
         printf("error to open: %s\n", file);
         exit(EXIT_FAILURE);
     }
     while((nread = getline(&buffer, &len, fp)) != -1) {
         if((buf=strstr(buffer, "MemTotal"))!=NULL)  /* 簡單實現grep的功能 */
         {
             buffer[strlen(buffer)-1]=0;             /* 簡單實現tr()函數的功能 */
             sscanf(buffer, "%s%s", content, content);
             int memtotal_kb=(int)(strtof(content, NULL));
             printf("內存總容量:\t%dG%4dM %4dK\n",
                     memtotal_kb/(1024*1024),           /* Gb */
                     (memtotal_kb/(1024))%1024,         /* Mb */
                     (memtotal_kb%(1024*1024))%1024);   /* Kb */
         }
         if((buf=strstr(buffer, "MemFree"))!=NULL)  /* 簡單實現grep的功能 */
         {
             buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
             sscanf(buffer, "%s%s", content, content);
             int memfree_kb=(int)(strtof(content, NULL));
             printf("內存可用容量:\t%dG%4dM %4dK\n",
                     memfree_kb/(1024*1024),           /* Gb */
                     (memfree_kb/(1024))%1024,         /* Mb */
                     (memfree_kb%(1024*1024))%1024);   /* Kb */
         }
         if((buf=strstr(buffer, "SwapTotal"))!=NULL)  /* 簡單實現grep的功能 */
         {
             buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
             sscanf(buffer, "%s%s", content, content);
             int swaptotal_kb=(int)(strtof(content, NULL));
             printf("SWAP總容量:\t%dG%4dM %4dK\n",
                     swaptotal_kb/(1024*1024),           /* Gb */
                     (swaptotal_kb/(1024))%1024,         /* Mb */
                     (swaptotal_kb%(1024*1024))%1024);   /* Kb */
         }
         if((buf=strstr(buffer, "SwapFree"))!=NULL)  /* 簡單實現grep的功能 */
         {
             buffer[strlen(buffer)-1]=0;                 /* 簡單實現tr()函數的功能 */
             sscanf(buffer, "%s%s", content, content);
             int swapfree_kb=(int)(strtof(content, NULL));
             printf("SWAP可用容量:\t%dG%4dM %4dK\n",
                     swapfree_kb/(1024*1024),           /* Gb */
                     (swapfree_kb/(1024))%1024,         /* Mb */
                     (swapfree_kb%(1024*1024))%1024);   /* Kb */
             break;                              /* 所需的信息已滿足,退出循環 */
         }
     }
 }
 /* 
  * ===  FUNCTION  ======================================================================
  *         Name:  main
  *  Description:  
  * =====================================================================================
  */
 int main ( int argc, char *argv[] )
 {
     printf(">>>系統負載<<<\n");
     sampleLoadAvg();
     printf("----------------------------------------\n");
     printf("\n");
     printf(">>>運行時間<<<\n");
     sampleTime();
     printf("\n");
     printf(">>>版本信息<<<\n");
     sampleOsType();
     sampleOsRelease();
     sampleKernelVersion();
     printf("----------------------------------------\n");
     printf("\n");
     printf(">>>磁盤信息<<<\n");
     sampleDiskStat();
     printf("----------------------------------------\n");
     printf("\n");
     printf(">>>上下文切換<<<\n");
     sampleContext();
     printf("----------------------------------------\n");
     printf("\n");
     printf(">>>線程數目<<<\n");
     sampleProcesses();
     printf("----------------------------------------\n");
     printf("\n");
     printf(">>>內存信息<<<\n");
     sampleMeminfo();
     printf("----------------------------------------\n");
     return EXIT_SUCCESS;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章