荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店