荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (eee), 信区: Linux
标  题: [源码]sysinfo.c
发信站: 荔园晨风BBS站 (Sun Sep 28 22:29:53 2003), 站内信件


/* 这个是操作系统设计的一个作业,贴出来给大家看看吧,献丑了 */
/* author: jiangjinke@163.com */
/* compile: gcc -O2 -Wall -o sysinfo sysinfo.c */
/* no warning :p */
/**
 * Usage: sysinfo [OPTIONS]
 * List Information about the system.
 *
 *   -h  print this usage
 *   -u  uptime
 *   -c  cpu info
 *   -k  kernel version
 *   -s  status report
 *   -m  memory info
 */
/* Only tested in Mandrake 7.0 2.2.14-1, Redhat 8.0 2.4.18-14 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>

#define BUF_SIZE 256
#define STRLEN   128

static void CPU_info();
static void kernel_info();
static void uptime();
static void stat_report();
static void mem_info();
static void usage();
static void parse_arg(const char *, const char, const char);
static void opt_err(const char *, const char);

int main(int argc, char *argv[])
{
  char c1,c2;

  if(argc>1)
  {
        sscanf(argv[1], "%c%c", &c1, &c2);
        parse_arg(argv[0],c1,c2);
        if(argc>2)
    {
      sscanf(argv[2], "%c%c", &c1, &c2);
          parse_arg(argv[0],c1,c2);
          if(argc>3)
          {
        sscanf(argv[3], "%c%c", &c1, &c2);
            parse_arg(argv[0],c1,c2);
                if(argc>4)
            {
              sscanf(argv[4], "%c%c", &c1, &c2);
              parse_arg(argv[0],c1,c2);
                  if(argc>5)
                  {
                    sscanf(argv[5], "%c%c",&c1,&c2);
                        parse_arg(argv[0],c1,c2);
            if(argc>6)
            {
              sscanf(argv[5], "%c%c",&c1,&c2);
              parse_arg(argv[0],c1,c2);
                        }
                  }
        }
          }
        }
  }
  else
  {
        uptime();
        CPU_info();
        kernel_info();
        stat_report();
        mem_info();
  }
  return 0;
}

static void CPU_info()
{
  FILE *fptrProcFile;
  unsigned char *ptr;
  unsigned char lineBuffer[BUF_SIZE+1];
  unsigned char vendor_id[STRLEN+1];
  unsigned char cpu_family[STRLEN+1];
  unsigned char cpu_model[STRLEN+1];
  unsigned char cpu_model_name[STRLEN+1];
  unsigned char *procfile_cpuinfo="/proc/cpuinfo";

  if((fptrProcFile=fopen(procfile_cpuinfo, "r"))==NULL)
  {
        fprintf(stderr, "error: %s does NOT exist!\n", procfile_cpuinfo);
    exit(-1);
  }
  while((fgets(lineBuffer, (BUF_SIZE+1), fptrProcFile)) !=NULL)
  {
        if(strstr(lineBuffer, "vendor_id"))
        {
          ptr=lineBuffer;
          while((*ptr)!=':' && (*ptr)!='\0')
            ptr++;
          ptr+=2;
          snprintf(vendor_id, (STRLEN+1), "%s", ptr);
        }
        else
        if(strstr(lineBuffer, "cpu family"))
        {
          ptr=lineBuffer;
          while((*ptr)!=':' && (*ptr)!='\0')
                ptr++;
          ptr+=2;
      snprintf(cpu_family, (STRLEN+1), "%s", ptr);
        }
        else
    if(strstr(lineBuffer, "model name"))
        {
          ptr=lineBuffer;
          while((*ptr)!=':' && (*ptr)!='\0')
                ptr++;
          ptr+=2;
      snprintf(cpu_model_name, (STRLEN+1), "%s", ptr);
        }
        else
        if(strstr(lineBuffer, "model"))
        {
          ptr=lineBuffer;
      while((*ptr)!=':' && (*ptr)!='\0')
                ptr++;
          ptr+=2;
      snprintf(cpu_model, (STRLEN+1), "%s", ptr);
        }

  }
  fclose(fptrProcFile);
  /* print CPU information */
  printf("\n+-------------------CPU Information-------------------+\n");
  printf(" vendor_id\t: %s", vendor_id);
  printf(" cpu family\t: %s", cpu_family);
  printf(" model\t\t: %s", cpu_model);
  printf(" model name\t: %s", cpu_model_name);
  printf("+-----------------------------------------------------+\n");
}

/* Print kernel information */
static void kernel_info()
{
  FILE *fptrProcFile;
  unsigned char os_type[STRLEN+1];
  unsigned char os_release[STRLEN+1];
  unsigned char krn_ver[STRLEN+1];
  unsigned char *procfile_ostype="/proc/sys/kernel/ostype";
  unsigned char *procfile_osrelease="/proc/sys/kernel/osrelease";
  unsigned char *procfile_version="/proc/sys/kernel/version";

  /* read proc filesystem */
  if((fptrProcFile=fopen(procfile_ostype, "r"))==NULL) /* get OS type info from
proc fs */
  {
        fprintf(stderr, "error: %s does NOT exist!\n", procfile_ostype);
        exit(1);
  }
  fgets(os_type, (STRLEN+1), fptrProcFile);
  fclose(fptrProcFile);
  if((fptrProcFile=fopen(procfile_osrelease, "r"))==NULL) /* get OS release
info from proc fs */
  {
    fprintf(stderr, "error: %s does NOT exist!\n", procfile_osrelease);
    exit(2);
  }
  fgets(os_release, (STRLEN+1), fptrProcFile);
  fclose(fptrProcFile);
  if((fptrProcFile=fopen(procfile_version, "r"))==NULL) /* get Kernel Version
info from proc fs */
  {
    fprintf(stderr, "error: %s does NOT exist!\n", procfile_version);
    exit(3);
  }
  fgets(krn_ver, (STRLEN+1), fptrProcFile);
  fclose(fptrProcFile);
  /* print the Kernel Information */
  printf("\n+------------------Kernel Information-----------------+\n");
  printf(" OS type : %s OS release : %s Kernel Version : %s", os_type,
os_release, krn_ver);
  printf("+-----------------------------------------------------+\n");
}

static void uptime()
{
  unsigned long uptime;
  FILE *fptrProcFile;
  int i,day,hour,min,sec;
  unsigned char uptime_str[STRLEN+1];
  unsigned char tmp[STRLEN+1];
  unsigned char *procfile_uptime="/proc/uptime";
  if((fptrProcFile=fopen(procfile_uptime, "r"))==NULL)
  {
    fprintf(stderr, "error: %s does NOT exist!\n", procfile_uptime);
        exit(4);
  }
  fgets(uptime_str,(STRLEN+1),fptrProcFile);

  i=0;
  while( uptime_str[i] != ' ')
  {
        tmp[i]=uptime_str[i];
    i++;
  }
  fclose(fptrProcFile);
  uptime=atoi(tmp);
  day = uptime/(3600*24);
  hour= uptime%(3600*24) /3600;
  min = uptime%(3600*24) %3600 / 60;
  sec = uptime%(60);
  printf("\n+-----------------------------------------------------+\n");
  printf("sytem uptime: %02d:%02d:%02d:%02d(dd:hh:mm:ss)\n",day,hour,min,sec);
  printf("+-----------------------------------------------------+\n");
}

/* kernel/system statistics */
static void stat_report()
{
  FILE *fptrProcFile;
  unsigned int i;
  unsigned long user_t,system_t,idle_t; /* in seconds */
  unsigned long disk_req; /* disk recieved requests */
  unsigned long ctxt; /* The number of context switches that the system
underwent. */
  unsigned long btime; /* boot time, in seconds since the epoch (January 1,
1970). */
  unsigned long process_t; /* */
  unsigned char *ptr;
  unsigned char lineBuffer[BUF_SIZE+1];
  unsigned char user_str[STRLEN+1];
  unsigned char system_str[STRLEN+1];
  unsigned char idle_str[STRLEN+1];
  unsigned char disk_str[STRLEN+1];
  unsigned char ctxt_str[STRLEN+1];
  unsigned char btime_str[STRLEN+1];
  unsigned char process_str[STRLEN+1];
  unsigned char *procfile_stat="/proc/stat";
  if((fptrProcFile=fopen(procfile_stat, "r"))==NULL)
  {
        fprintf(stderr, "error: %s does NOT exist!\n", procfile_stat);
    exit(-1);
  }
  while((fgets(lineBuffer, (BUF_SIZE+1), fptrProcFile)) !=NULL)
  {
        if(strstr(lineBuffer,"cpu"))
        {
          ptr=lineBuffer;
      while((*ptr)!=' ' && (*ptr)!='\0')
                ptr++;
          while(*ptr==' ')
                ptr++;
      i=0;
      while((*ptr)!=' ' && (*ptr)!='\0')
      {
        user_str[i]=*ptr;
        ptr++;
        i++;
      }
      user_str[i]='\0';
      /* pass the second num part */
      while((*ptr)!=' ' && (*ptr)!='\0')
        ptr++;
          while(*ptr==' ')
        ptr++;

      while((*ptr)!=' ' && (*ptr)!='\0')
            ptr++;
          while(*ptr==' ')
                ptr++;
          i=0;
      while((*ptr)!=' ' && (*ptr)!='\0')
          {
            system_str[i]=*ptr;
            ptr++;
            i++;
          }
      system_str[i]='\0';
      while((*ptr)!=' ' && (*ptr)!='\0')
            ptr++;
          while(*ptr==' ')
            ptr++;
          i=0;
      while((*ptr)!=' ' && (*ptr)!='\0')
          {
            idle_str[i]=*ptr;
            ptr++;
            i++;
          }
          idle_str[i]='\0';
        }
        else
        if(strstr(lineBuffer, "disk_"))
        {
       continue;
        }
        else
        if(strstr(lineBuffer, "disk"))
        {
          ptr=lineBuffer;
          while((*ptr)!=' ' && (*ptr)!='\0')
            ptr++;
          while(*ptr==' ')
                ptr++;
          i=0;
          while((*ptr)!=' ' && (*ptr)!='\0')
          {
                disk_str[i]=*ptr;
                ptr++;
                i++;
          }
          disk_str[i]='\0';
        }
        else
    if(strstr(lineBuffer, "ctxt"))
    {
          ptr=lineBuffer;
      while((*ptr)!=' ' && (*ptr)!='\0')
        ptr++;
      while(*ptr==' ')
        ptr++;
      i=0;
      while((*ptr)!=' ' && (*ptr)!='\0')
      {
        ctxt_str[i]=*ptr;
        ptr++;
        i++;
      }
      ctxt_str[i]='\0';
    }
    else
    if(strstr(lineBuffer, "btime"))
    {
          ptr=lineBuffer;
      while((*ptr)!=' ' && (*ptr)!='\0')
        ptr++;
      while(*ptr==' ')
        ptr++;
     i=0;
     while((*ptr)!=' ' && (*ptr)!='\0')
     {
        btime_str[i]=*ptr;
        ptr++;
        i++;
     }
     btime_str[i]='\0';
    }
    else
    if(strstr(lineBuffer, "processes"))
    {
          ptr=lineBuffer;
      while((*ptr)!=' ' && (*ptr)!='\0')
        ptr++;
      while(*ptr==' ') /* filter spaces */
        ptr++;
      i=0;
      while((*ptr)!=' ' && (*ptr)!='\0')
      {
        process_str[i]=*ptr;
        ptr++;
        i++;
      }
      process_str[i]='\0';
    }
  }
  fclose(fptrProcFile);

  user_t=atoi(user_str);
  system_t=atoi(user_str);
  idle_t=atoi(idle_str);
  disk_req=atoi(disk_str);
  ctxt=atoi(ctxt_str);
  btime=atoi(btime_str);
  process_t=atoi(process_str);
  printf("\n+---------------kernel/system statistics--------------+\n");
  printf("cpu time: %ld user, %ld system, %ld idle\n",user_t,system_t,idle_t);
  printf("disk recieved requests: %ld\n",disk_req);
  printf("context switches: %ld\n",ctxt);
  printf("boot time: %s", ctime(&btime));
  printf("processes created since the last boot: %ld\n", process_t);
  printf("+-----------------------------------------------------+\n");

}
static void mem_info()
{
  FILE *fptrProcFile;
  unsigned char *ptr;
  unsigned char lineBuffer[BUF_SIZE+1];
  unsigned char MemTotal[STRLEN+1];
  unsigned char MemFree[STRLEN+1];
  unsigned char *procfile_meminfo="/proc/meminfo";

  if((fptrProcFile=fopen(procfile_meminfo, "r"))==NULL)
  {
    fprintf(stderr, "error: %s does NOT exist!\n", procfile_meminfo);
        exit(-1);
  }
  while(fgets(lineBuffer, (BUF_SIZE+1), fptrProcFile) != NULL)
  {
        if(strstr(lineBuffer,"MemTotal"))
        {
      ptr=lineBuffer;
      while((*ptr)!=' ' && (*ptr)!='\0')
                ptr++;
          while(*ptr==' ') /* eat up all spaces */
                ptr++;
          snprintf(MemTotal, (STRLEN+1), ptr);
        }
        else
    if(strstr(lineBuffer,"MemFree"))
        {
          ptr=lineBuffer;
     while((*ptr)!=' ' && (*ptr)!='\0')
       ptr++;
     while(*ptr==' ') /* eat up all spaces */
       ptr++;
     snprintf(MemFree, (STRLEN+1), ptr);
        }
  }
  printf("\n+-------------Memory Info--------------+\n");
  printf("Memory Total: %s", MemTotal);
  printf("Memory Free : %s", MemFree);
  printf("+--------------------------------------+\n");
}
static void usage(const char *argv)
{
  fprintf(stderr, "\nUsage: %s [OPTIONS]\n", argv);
  fprintf(stderr, "List Information about the system. \n\n");
  fprintf(stderr, "  -h print this usage\n");
  fprintf(stderr, "  -u uptime\n");
  fprintf(stderr, "  -c cpu info\n");
  fprintf(stderr, "  -k kernel version\n");
  fprintf(stderr, "  -s status report\n");
  fprintf(stderr, "  -m memory info\n\n");
}
static void parse_arg(const char *argv,const char c1, const char c2)
{
    int err;
    if(c1!='-')
    {
      usage(argv);
      exit(-1);
    }

    if(c2=='h')
    {
      usage(argv);
      exit(-2);
    }

    err=1;
    if(c2=='c')
    {
      CPU_info();
      err=0;
    }
        else
    if(c2=='k')
    {
      kernel_info();
      err=0;
    }
        else
    if(c2=='u')
    {
      uptime();
      err=0;
    }
        else
        if(c2=='s')
        {
          stat_report();
          err=0;
        }
        if(c2=='m')
        {
          mem_info();
          err=0;
        }
    if(err)
    {
      opt_err(argv,c2);
      exit(-3);
    }
}
static void opt_err(const char *appname,const char opt)
{
  fprintf(stderr, "%s: invalid option -- %c\n", appname, opt);
  fprintf(stderr, "Try `%s -h' for more information.\n", appname);
}

--
      ξ
      █D

 Would you like to have a cup of tea with me?

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.234]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店