问题 A :
1、提取cpu 类型
2、提取内核版本
问题 B:
1、启动以来经历的时间,以 dd:hh:mm:ss 报告
问题 C:
1、cpu 执行用户态、系统态、空闲态所用时间
2、多少次磁盘请求
3、多少次上下文切换
4、启动了多少次进程
实验问题 D:
1、内存总量
2、可用内存
3、系统平均负荷
解决问题A:
1、读取文件/proc/cpuinfo,并且将结果显示即可。
2、读取文件/proc/version,并且将结果显示即可。
解决问题B:
读取文件/proc/uptime,第一个参数是代表从系统启动到现在的时间(以秒为单位),第二个参数是代表系统空闲的时间(以秒为单位)。因此将第一个参数转成dd:hh:mm:ss即可。如何转化
解决问题C:
1、读取文件/proc/stat即可。第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。
如:cpu 25579 49 1340 333457 23139 33 343 0 0
25579:用户态的运行时间
1340:系统态运行时间
333457:空闲态时间(单位为节拍,与系统进程调度的最小时间片有关)
那么OK,1就解决了。
2、磁盘请求在/proc/diskstat文件中。磁盘请求次数为读和写次数之和。文件参数含义
3、上下文请求次数为/proc/stat文件中包含ctxt:的行。
4、启动了多少次进程为/proc/stat文件中包含process的行。
解决问题D:
1、2、/proc/meminfo的前两行信息。
3、/proc/loadavg文件中,第一个为系统近1分钟内的平均负荷。第二个为近5分钟的平均负荷。第三个为近15分钟的平均负荷。
实验难点:找到对应信息的文件,弄清楚文件中每个参数的含义。
代码:
#include
#include
int main(int argc,char *argv[])
{
if(argc != 2)
{
printf("arguments number error!\n");
return 0;
}
if(argv[1][0]!='-' || argv[1][1]<'a' || argv[1][1]>'d')
{
printf("arguments format error!\n");
return 0;
}
FILE *fp;
char linebuf[1024],*cputype,*tmp;
int leng,i,t,index,disknumb;
long systime,day,hour,minute,second;
char *cdtime[4];
char *disknum[2];
if(argv[1][1] == 'a')
{
printf("-----PART A-----\n");
fp = fopen("/proc/cpuinfo","r");
while(fgets(linebuf,1024,fp)!=NULL)
{
if(strstr(linebuf,"model name")!=NULL)
{
cputype = strstr(linebuf,":");
cputype += 2;
printf("-----cpu type-----\n");
printf("%s",cputype);
break;
}
}
fclose(fp);
fp = fopen("/proc/version","r");
printf("-----kernel version-----\n");
fgets(linebuf,1024,fp);
tmp = strstr(linebuf,"(gcc");
*(tmp-1) = '\n';
*tmp = 0;
printf("%s",linebuf);
fclose(fp);
}
else if(argv[1][1] == 'b')
{
printf("-----PART B-----\n");
fp = fopen("/proc/uptime","r");
printf("-----system time-----\n");
fgets(linebuf,1024,fp);
tmp = linebuf;
*strchr(linebuf,'.') = 0;
leng = strlen(tmp);
t = 1;
systime = 0;
for(i=leng-1; i>=0; i--)
{
systime += (tmp[i]-'0')*t;
t *= 10;
}
day = systime/86400;//60*60*24
systime %= 86400;
hour = systime/3600;
systime %= 3600;
minute = systime/60;
second = systime%60;
printf("%ld:%ld:%ld:%ld\n",day,hour,minute,second);
fclose(fp);
}
else if(argv[1][1] == 'c')
{
printf("-----PART C-----\n");
fp = fopen("/proc/stat","r");
fgets(linebuf,1024,fp);
leng = strlen(linebuf);
index = 0;
for(i=0; i1; i++)
{
if(linebuf[i]==' '&&linebuf[i+1]!=' ')
{
linebuf[i] = 0;
if(index < 4)
cdtime[index++] = &linebuf[i+1];
else
break;
}
}
printf("-----usertime systime idletime-----\n");
printf("%s %s %s\n",cdtime[0],cdtime[2],cdtime[3]);
while(fgets(linebuf,1024,fp)!=NULL)
{
if((tmp=strstr(linebuf,"ctxt"))!=NULL)
{
printf("-----context switch-----\n");
printf("%s",tmp+5);
}
if((tmp=strstr(linebuf,"processes"))!=NULL)
{
printf("-----processes-----\n");
printf("%s",tmp+10);
}
}
fclose(fp);
fp = fopen("/proc/diskstats","r");
while(fgets(linebuf,1024,fp)!=NULL)
{
if((tmp=strstr(linebuf,"sda"))!=NULL)
{
printf("-----disk visit-----\n");
disknum[0] = tmp+4;
tmp = tmp + 4;
for(i=0; i<4; i++)
{
while(*tmp != ' ')
tmp++;
*tmp = 0;
tmp++;
}
disknum[1] = tmp;
while(*tmp != ' ')
tmp++;
*tmp = 0;
disknumb = 0;
leng = strlen(disknum[0]);
t = 1;
for(i=leng-1; i>=0; i--)
{
disknumb += (disknum[0][i]-'0')*t;
t *= 10;
}
leng = strlen(disknum[1]);
t = 1;
for(i=leng-1; i>=0; i--)
{
disknumb += (disknum[1][i]-'0')*t;
t *= 10;
}
printf("%d\n",disknumb);
break;
}
}
fclose(fp);
}
else
{
printf("-----PART D-----\n");
fp = fopen("/proc/meminfo","r");
fgets(linebuf,1024,fp);
tmp = strchr(linebuf,':');
tmp++;
while(*tmp == ' ')
tmp++;
printf("-----total memory-----\n");
printf("%s",tmp);
fgets(linebuf,1024,fp);
tmp = strchr(linebuf,':');
tmp++;
while(*tmp == ' ')
tmp++;
printf("-----free memory-----\n");
printf("%s",tmp);
fclose(fp);
fp = fopen("/proc/loadavg","r");
fgets(linebuf,1024,fp);
tmp = strchr(linebuf,' ');
*tmp = 0;
printf("-----average load-----\n");
printf("%s\n",linebuf);
fclose(fp);
}
return 0;
}