⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 observer.c

📁 该程序使用/proc机制检查反映机器平均负载
💻 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 + -