zoukankan      html  css  js  c++  java
  • 〖Linux〗proc的一些文件读取操作

      1 /*
      2  * =====================================================================================
      3  *
      4  *       Filename:  proc_more.c
      5  *
      6  *    Description:  
      7  *
      8  *        Version:  1.0
      9  *        Created:  2013年08月07日 11时34分40秒
     10  *       Revision:  none
     11  *       Compiler:  gcc
     12  *
     13  *         Author:  linkscue (scue), linkscue@gmail.com
     14  *   Organization:  
     15  *
     16  * =====================================================================================
     17  */
     18 
     19 #include <stdio.h>
     20 #include <sys/time.h>
     21 #include <sys/types.h>
     22 #include <sys/stat.h>
     23 #include <unistd.h>
     24 #include <fcntl.h>
     25 #include <stdlib.h>
     26 #include <string.h>
     27 void sampleLoadAvg(){
     28     int f=0;
     29     char buffer[80]="";                         /* 定义字符串并初始化为'' */
     30     char buf[5][10];
     31     char *file="/proc/loadavg";
     32     f = open(file, O_RDONLY);
     33     if (f == 0)
     34     {
     35         printf("error to open: %s
    ", file);
     36         exit(EXIT_FAILURE);
     37     }
     38     read(f, (void *)buffer, 80);
     39     sscanf(buffer, "%s %s %s %s %s",            /* sscanf()拆分成多个字符串 */
     40             &buf[0],&buf[1],&buf[2],&buf[3],&buf[4]);
     41     printf("一分钟平均负载:%s
    ", buf[0]);
     42     printf("五分钟平均负载:%s
    ", buf[1]);
     43     printf("一刻钟平均负载:%s
    ", buf[2]);
     44     printf("采样时刻的间隔:%s
    ", buf[3]);
     45     printf("最大线程的数目:%s
    ", buf[4]);
     46     close(f);
     47 }
     48 void sampleTime(){
     49     int f=0;
     50     char buffer[80]="";
     51     char buf[2][10];
     52     float seconds=0;
     53     float secondr=0;
     54     char *file="/proc/uptime";
     55     f = open(file, O_RDONLY);
     56     if (f == 0)
     57     {
     58         printf("error to open: %s
    ", file);
     59         exit(EXIT_FAILURE);
     60     }
     61     read(f, (void *)buffer, 80);
     62     sscanf(buffer, "%s %s", &buf[0], &buf[1]);
     63     close(f);
     64     printf("系统运行时间:	%s秒
    ", buf[0]);
     65     printf("系统空闲时间:	%s秒
    ", buf[1]);
     66     close(f);
     67     seconds=strtof(buf[0],NULL);
     68     secondr=strtof(buf[1],NULL);
     69     printf("系统运行时间:	%03d天%02d时%02d分%02.6f秒
    ", 
     70             (int)seconds/(24*3600),             /**/
     71             ((int)seconds/(3600))%(24),         /**/
     72             ((int)seconds/60)%60,               /**/
     73             ((int)seconds%60)+(seconds-(int)seconds)); /* 秒(精确至毫秒) */
     74     printf("系统空闲时间:	%03d天%02d时%02d分%02.6f秒
    ", 
     75             (int)secondr/(24*3600),             /**/
     76             ((int)secondr/(3600))%(24),         /**/
     77             ((int)secondr/60)%60,               /**/
     78             ((int)secondr%60)+(secondr-(int)secondr)); /* 秒(精确至毫秒) */
     79 }
     80 
     81 void sampleKernelVersion(){
     82     int f=0;
     83     char buffer[80]="";
     84     char *file="/proc/sys/kernel/version";
     85     f = open(file, O_RDONLY);
     86     if (f == 0)
     87     {
     88         printf("error to open: %s
    ", file);
     89         exit(EXIT_FAILURE);
     90     }
     91     read(f, (void *)buffer, 80);
     92     buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
     93     printf("当前内核版本:	%s
    ", buffer);
     94     close(f);
     95 }
     96 
     97 void sampleOsRelease(){
     98     int f=0;
     99     char buffer[80]="";
    100     char *file="/proc/sys/kernel/osrelease";
    101     f = open(file, O_RDONLY);
    102     if (f == 0)
    103     {
    104         printf("error to open: %s
    ", file);
    105         exit(EXIT_FAILURE);
    106     }
    107     read(f, (void *)buffer, 80);
    108     buffer[strlen(buffer)-1]=0;
    109     printf("当前发行版本:	%s
    ", buffer);
    110     close(f);
    111 }
    112 
    113 void sampleOsType(){
    114     int f=0;
    115     char buffer[80]="";
    116     char *file="/proc/sys/kernel/ostype";
    117     f = open(file, O_RDONLY);
    118     if (f == 0)
    119     {
    120         printf("error to open: %s
    ", file);
    121         exit(EXIT_FAILURE);
    122     }
    123     read(f, (void *)buffer, 80);
    124     buffer[strlen(buffer)-1]=0;
    125     printf("当前操作系统:	%s
    ", buffer);
    126     close(f);
    127 }
    128 
    129 void sampleDiskStat(){
    130     int i;
    131     FILE *fp;
    132     int nread=0;
    133     ssize_t len = 0;
    134     char *buffer=NULL;
    135     char buf[20][32];
    136     char *file="/proc/diskstats";
    137     char *p;
    138     fp = fopen(file, "rb");
    139     if (fp == NULL)
    140     {
    141         printf("error to open: %s
    ", file);
    142         exit(EXIT_FAILURE);
    143     }
    144     printf("  磁盘  读次数  写次数
    ");
    145     while((nread = getline(&buffer, &len, fp)) != -1) { /* 简单实现读行的功能 */
    146         sscanf(buffer, "%04s%08s%s %s %s %s %s %s %s %s %s %s %s %s", 
    147                 &buf[0],&buf[1],&buf[2],&buf[3],&buf[4],&buf[5],&buf[6],
    148                 &buf[7],&buf[8],&buf[9],&buf[10],&buf[11],&buf[12],&buf[13]);
    149         if ((p=strstr(buf[2], "loop"))!=NULL)
    150         {
    151             ;                                   /* loop本地回路不作操作 */
    152         }
    153         else {
    154             printf("%06s%08s%08s
    ", 
    155                     &buf[2],&buf[3], &buf[7]);
    156         }
    157     }
    158 }
    159 
    160 void sampleProcesses(void)
    161 {
    162     FILE *fp;
    163     int nread=0;
    164     ssize_t len = 0;
    165     char *buf=NULL;
    166     char *buffer=NULL;
    167     char *file="/proc/stat";
    168     fp = fopen(file, "rb");
    169     if (fp == NULL)
    170     {
    171         printf("error to open: %s
    ", file);
    172         exit(EXIT_FAILURE);
    173     }
    174     while((nread = getline(&buffer, &len, fp)) != -1) {
    175         if((buf=strstr(buffer, "processes"))!=NULL)  /* 简单实现grep的功能 */
    176             break;
    177     }
    178     buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
    179     char count[16]="";
    180     sscanf(buffer, "%s%s", count, count);
    181     printf("执行线程数目:	%s
    ", count);
    182 }
    183 
    184 void sampleContext(void)
    185 {
    186     FILE *fp;
    187     int nread=0;
    188     ssize_t len = 0;
    189     char *buf=NULL;
    190     char *buffer=NULL;
    191     char *file="/proc/stat";
    192     fp = fopen(file, "rb");
    193     if (fp == NULL)
    194     {
    195         printf("error to open: %s
    ", file);
    196         exit(EXIT_FAILURE);
    197     }
    198     while((nread = getline(&buffer, &len, fp)) != -1) {
    199         if((buf=strstr(buffer, "ctxt"))!=NULL)  /* 简单实现grep的功能 */
    200             break;
    201     }
    202     buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
    203     char count[16]="";
    204     sscanf(buffer, "%s%s", count, count);
    205     printf("上下文切换次数:	%s
    ", count);
    206 }
    207 
    208 void sampleMeminfo()
    209 {
    210     FILE *fp;
    211     int nread=0;
    212     ssize_t len = 0;
    213     char *buf=NULL;
    214     char *buffer=NULL;
    215     char *file="/proc/meminfo";
    216     char content[16]="";
    217     fp = fopen(file, "rb");
    218     if (fp == NULL)
    219     {
    220         printf("error to open: %s
    ", file);
    221         exit(EXIT_FAILURE);
    222     }
    223     while((nread = getline(&buffer, &len, fp)) != -1) {
    224         if((buf=strstr(buffer, "MemTotal"))!=NULL)  /* 简单实现grep的功能 */
    225         {
    226             buffer[strlen(buffer)-1]=0;             /* 简单实现tr()函数的功能 */
    227             sscanf(buffer, "%s%s", content, content);
    228             int memtotal_kb=(int)(strtof(content, NULL));
    229             printf("内存总容量:	%dG%4dM %4dK
    ",
    230                     memtotal_kb/(1024*1024),           /* Gb */
    231                     (memtotal_kb/(1024))%1024,         /* Mb */
    232                     (memtotal_kb%(1024*1024))%1024);   /* Kb */
    233         }
    234         if((buf=strstr(buffer, "MemFree"))!=NULL)  /* 简单实现grep的功能 */
    235         {
    236             buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
    237             sscanf(buffer, "%s%s", content, content);
    238             int memfree_kb=(int)(strtof(content, NULL));
    239             printf("内存可用容量:	%dG%4dM %4dK
    ",
    240                     memfree_kb/(1024*1024),           /* Gb */
    241                     (memfree_kb/(1024))%1024,         /* Mb */
    242                     (memfree_kb%(1024*1024))%1024);   /* Kb */
    243         }
    244         if((buf=strstr(buffer, "SwapTotal"))!=NULL)  /* 简单实现grep的功能 */
    245         {
    246             buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
    247             sscanf(buffer, "%s%s", content, content);
    248             int swaptotal_kb=(int)(strtof(content, NULL));
    249             printf("SWAP总容量:	%dG%4dM %4dK
    ",
    250                     swaptotal_kb/(1024*1024),           /* Gb */
    251                     (swaptotal_kb/(1024))%1024,         /* Mb */
    252                     (swaptotal_kb%(1024*1024))%1024);   /* Kb */
    253         }
    254         if((buf=strstr(buffer, "SwapFree"))!=NULL)  /* 简单实现grep的功能 */
    255         {
    256             buffer[strlen(buffer)-1]=0;                 /* 简单实现tr()函数的功能 */
    257             sscanf(buffer, "%s%s", content, content);
    258             int swapfree_kb=(int)(strtof(content, NULL));
    259             printf("SWAP可用容量:	%dG%4dM %4dK
    ",
    260                     swapfree_kb/(1024*1024),           /* Gb */
    261                     (swapfree_kb/(1024))%1024,         /* Mb */
    262                     (swapfree_kb%(1024*1024))%1024);   /* Kb */
    263             break;                              /* 所需的信息已满足,退出循环 */
    264         }
    265     }
    266 }
    267 /* 
    268  * ===  FUNCTION  ======================================================================
    269  *         Name:  main
    270  *  Description:  
    271  * =====================================================================================
    272  */
    273 int main ( int argc, char *argv[] )
    274 {
    275     printf(">>>系统负载<<<
    ");
    276     sampleLoadAvg();
    277     printf("----------------------------------------
    ");
    278     printf("
    ");
    279     printf(">>>运行时间<<<
    ");
    280     sampleTime();
    281     printf("
    ");
    282     printf(">>>版本信息<<<
    ");
    283     sampleOsType();
    284     sampleOsRelease();
    285     sampleKernelVersion();
    286     printf("----------------------------------------
    ");
    287     printf("
    ");
    288     printf(">>>磁盘信息<<<
    ");
    289     sampleDiskStat();
    290     printf("----------------------------------------
    ");
    291     printf("
    ");
    292     printf(">>>上下文切换<<<
    ");
    293     sampleContext();
    294     printf("----------------------------------------
    ");
    295     printf("
    ");
    296     printf(">>>线程数目<<<
    ");
    297     sampleProcesses();
    298     printf("----------------------------------------
    ");
    299     printf("
    ");
    300     printf(">>>内存信息<<<
    ");
    301     sampleMeminfo();
    302     printf("----------------------------------------
    ");
    303     return EXIT_SUCCESS;
    304 }
  • 相关阅读:
    C++ Compress Floder
    C语言: 两个int变量相除,结果保留两位小数
    过滤Windows文件名中的非法字符
    判断两个vector是否相等
    顶级操盘手是怎样准确把握入场时机的
    短线黑马选股绝技
    短线黑马选股绝技 一
    每日一招:短线炒股实用技巧
    高抛低吸T+0操作要领(目前行情短线炒作的必备技能)
    如何买开盘即涨停的个股
  • 原文地址:https://www.cnblogs.com/scue/p/3244753.html
Copyright © 2011-2022 走看看