📄 observer.c
字号:
/*************************************************************************** main.c - description ------------------- begin : 一 4月 4 21:01:11 CST 2003 copyright : (C) 2003 by 张鸿烈 Function : 观察linux内核行为/***************************************************************************/ #include <stdio.h>#include <sys/time.h>#define LB_SIZE 80enum TYPE{STANDARD,SHORT,LONG};FILE *thisProcFile;struct timeval now;enum TYPE reportType;char repTypeName[16];char *lineBuf;int interval; int duration;int iteration;char c1,c2;void sampleLoadAvg(){ //观察系统负荷 int i=0; thisProcFile = fopen("/proc/loadavg","r"); fgets(lineBuf,LB_SIZE+1,thisProcFile); while(*(lineBuf+i)==' ') ++i;//跳过前导空格 printf("\nOne minute average "); while(*(lineBuf+i)!=' ') {printf("%c",*(lineBuf+i)); i++;}//显示行中第一字段 while(*(lineBuf+i)==' ') ++i;//跳过前导空格 printf("\nFive minute average "); while(*(lineBuf+i)!=' ') {printf("%c",*(lineBuf+i)); i++;}//显示行中第二字段 while(*(lineBuf+i)==' ') ++i;//跳过前导空格 printf("\nTen minute average "); while(*(lineBuf+i)!=' ') {printf("%c",*(lineBuf+i)); i++;}//显示行中第三字段 while(*(lineBuf+i)==' ') ++i;//跳过前导空格 printf("\nRunuing Task/Total Task "); while(*(lineBuf+i)!=' ') {printf("%c",*(lineBuf+i)); i++;}//显示行中第四字段 while(*(lineBuf+i)==' ') ++i;//跳过前导空格 printf("\nLast Process ID "); while(*(lineBuf+i)!='\0') {printf("%c",*(lineBuf+i)); i++;}//显示行中第五字段 printf("\n"); fclose(thisProcFile);}void sampleTime(){//观察系统启动时间 long uptime,idletime; int day,hour,minute,second; int i,j; char temp[80]; i=j=0; thisProcFile = fopen("/proc/uptime","r"); fgets(lineBuf,LB_SIZE+1,thisProcFile); printf("%s\n",lineBuf); while(*(lineBuf+i)==' ') ++i;//跳过前导空格 while(*(lineBuf+i)!=' ') { *(temp+j)=*(lineBuf+i); i++; j++;}//取行中第一字段 *(temp+j)='\0'; uptime = atoi(temp);//将启动时间的秒数转换为长整数 day = uptime/(3600*24);//求出日数 hour= uptime%(3600*24)/3600;//求出小时数 minute=(uptime%(3600*24)%3600)/60;//求出分钟数 second=uptime%60;//求出秒数 printf("Time from Boot\n"); printf("%d:%d:%d:%d\n\n",day,hour,minute,second); j=0; while(*(lineBuf+i)==' ') ++i; while(*(lineBuf+i)!='\0') { *(temp+j)=*(lineBuf+i); i++; j++;}//取行中第一字段 *(temp+j)='\0'; idletime = atoi(temp);//将启动时间的空闲秒数转换为长整数 day = idletime/(3600*24);//求出日数 hour= idletime%(3600*24)/3600;//求出小时数 minute=(idletime%(3600*24)%3600)/60;//求出分钟数 second=idletime%60;//求出秒数 printf("Idle Time from Boot\n"); printf("%d:%d:%d:%d\n\n",day,hour,minute,second); printf("System Efficiency=%f\n\n",(float)uptime/(float)idletime);}int main(int argc,char *argv[]){ lineBuf = (char *)malloc(LB_SIZE+1); reportType = STANDARD; strcpy(repTypeName,"Standard"); if(argc >1){ sscanf(argv[1],"%c%c",&c1,&c2);//取命令行选择符 if(c1!='-'){ printf("usage:observer [-b] [-c] [-d int dur]\n"); exit(1); } if(c2 == 'b'){//观察部分B printf("******PART B **********\n"); thisProcFile = fopen("/proc/meminfo","r"); //观察内存信息 while(!feof(thisProcFile)){ fgets(lineBuf,LB_SIZE+1,thisProcFile); printf("%s",lineBuf); } printf("\n"); fclose(thisProcFile); sampleTime(); } else if(c2=='c'){//观察部分C printf("******PART C**********\n"); thisProcFile = fopen("/proc/stat","r"); while(!feof(thisProcFile)){//取系统工作状态信息 fgets(lineBuf,LB_SIZE+1,thisProcFile); printf("%s",lineBuf); } printf("\n"); fclose(thisProcFile); } else if(c2 == 'd'){ //观察部分 D printf("******PART D **********\n"); if(argc<4){ printf("usage:observer [-b] [-c][-d int dur]\n"); exit(1); } reportType = LONG; strcpy(repTypeName,"Long"); interval = atoi(argv[2]);//时间间隔 duration = atoi(argv[3]);//时间段 iteration = 0; while(iteration<duration){ sleep(interval);//睡眠一段时间 sampleLoadAvg();//观察1,5,10分钟系统平均负荷 iteration += interval;//加一个时间片 } } } else{//观察部分B printf("******PART A **********\n"); reportType = SHORT; strcpy(repTypeName,"Short"); gettimeofday(&now,NULL);//取系统时间 printf("Status report type %s at %s\n", repTypeName,ctime(&(now.tv_sec))); thisProcFile = fopen("/proc/sys/kernel/hostname","r"); fgets(lineBuf,LB_SIZE+1,thisProcFile);//取机器名 printf("Machine hostname:%s\n",lineBuf); fclose(thisProcFile); thisProcFile = fopen("/proc/cpuinfo","r"); while(!feof(thisProcFile)){//取CPU信息 fgets(lineBuf,LB_SIZE+1,thisProcFile); printf("%s",lineBuf); } printf("\n"); fclose(thisProcFile); thisProcFile = fopen("/proc/version","r"); while(!feof(thisProcFile)){//取OS版本号 fgets(lineBuf,LB_SIZE+1,thisProcFile); printf("%s",lineBuf); } printf("\n"); fclose(thisProcFile); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -