开始学习 《Linux操作系统内核实习》了!
这是我做的练习一的解答。
1、cpu的类型与型号
/proc/cpuinfo
2、所使用的Linux内核版本
/proc/version
3、从系统最后一次启动以来已经经历了时间
/proc/stat (btime)
/proc/uptime 这个好像也可以,没有求证哦:(
4、总共有多少cpu时间执行在用户态?系统态?空闲态?
/proc/stat 第一行 第一个域是用户态时间, 第二个是低优先权用户模式时间,第三个是系统态时间
第四个是空闲态时间。
5、配置了多少内存?当前多少可用?
/proc/meminfo
6、有多少磁盘读写请求
/proc/diskstats 参考linux源码中的/Document/iostats.txt
我的是sda项中的第1个域(读),第5个域(写)。
7、内核已经进行了多少次上下文切换?
/proc/stat ctxt域
8、从系统启动以来已经创建了多少进程?
/proc/stat proccesses域
9、平均负载
/proc/loadavg 不过我还是不太明白这个平均负载的意思,man中似乎也写的不是很明白
下面来就是代码了(这个是最让人心安的啦:)),不对的地方请多多指教:)
代码里没什么注释,实在是不好意:(
#include
#include
#include
#include
#include
#include
#define STANDARD 0
#define SHORT 1
#define LONG 2
#define LB_SIZE 300
typedef struct{
int processor; //cpu number
char vendor_id[50];
int cpu_family;
int model;
char model_name[50];
int stepping;
float cpu_MHz;
int cache_size;
char fdiv_bug;
char hlt_bug;
char f00f_bug;
char fpu;
char fpu_exception;
int cpuid_level;
char wp;
char flags[100];
float bogomips;
int clflush_size;
}CPUINFO;
typedef struct{
time_t cpu_usr; //user model
time_t cpu_nice; //user model with low priority
time_t cpu_sys; //system model
time_t cpu_idle; //idle model
long intrTotal; //total counts of interrupts serviced since boot time
long ctxt; //context switches
time_t btime; //boot time, in seconds since the Epoch (January 1,
//1970
long procs_n; //Number of forks since boot
} STAT;
void repShort(void);
void repLong(int interval, int duration);
char* findstr(char *buf, const char *str, char c);
int main (int argc, char **argv)
{
CPUINFO cpuinfo;
STAT stat;
char kversion[100]; //linux kernel version
int totalMem, freeMem;
time_t timeCur;
time_t runTimeCal;
FILE *fpstat, *fpcpuinfo, *fpversion, *fpmeminfo, *fpdiskstats;
char buf[100];
int interval;
int duration;
char repTypeName[16];
int repType = STANDARD; /* default is standard */
strcpy(repTypeName, "Standard");
/* Get option and arg */
char oc;
while ((oc = getopt(argc, argv, "sl:")) != -1) {
switch (oc) {
case 's':
repType = SHORT;
strcpy(repTypeName, "Short");
break;
case 'l':
repType = LONG;
strcpy(repTypeName, "Long");
interval = atoi(optarg);
if (argv[optind] == NULL) {
fprintf(stderr, "%s: option `-l` must have two argument!\n", argv[0]);
exit(-1);
}
duration = atoi(argv[optind++]);
break;
default:
return 0;
} /* end switch */
}/* end while */
/* get time now */
struct timeval now;
gettimeofday(&now, NULL);
printf("Status report type %s at %s\n",
repTypeName, ctime(&(now.tv_sec)));
FILE *thisProcFile = fopen("/proc/sys/kernel/hostname", "r");
fgets(buf, 99, thisProcFile);
printf("Machine hostname: %s\n", buf);
fclose(thisProcFile);
if ((fpcpuinfo = fopen("/proc/cpuinfo", "r")) == NULL) {
perror("Can not open the file \"/proc/cpuinfo\" !");
exit(-1);
}
int i;
char c;
char *p; //temp pointer
//cpuinfo
while( !feof(fpcpuinfo) ){
if( fgets(buf, 99, fpcpuinfo) == NULL) {
perror("read file /proc/cpuinfo failed !\n");
exit(-1);
}
if(strstr(buf, "model") != NULL){ //finded "model"
p = strrchr(buf, ':');
p++;
cpuinfo.model = atoi(p);
}
if(strstr(buf, "model name") != NULL){ //finded "model name"
p = strrchr(buf, ':');
p++;
strcpy(cpuinfo.model_name, p);
break;
}
}
printf("cpu's model : %d\n", cpuinfo.model);
printf("cpu's model_name : %s\n", cpuinfo.model_name);
fclose(fpcpuinfo);
//version
if( (freopen("/proc/version", "r", stdin)) == NULL ) {
perror("Can not open /proc/version !\n");
exit(-1);
}
gets(buf);
printf("linux version : %s\n", buf);
fclose(stdin);
//system run time
if( (fpstat = fopen("/proc/stat", "r")) == NULL) {
perror("Can not open /proc/version !\n");
exit(-1);
}
while(!feof(fpstat)) {
fgets(buf, 99, fpstat);
//printf("%s\n", buf);
if( strstr(buf, "btime") != NULL ) {
sscanf(buf, "%*s%s", buf);
//p = strchr(buf, ' ');
stat.btime = atol(buf);
break;
}
}
timeCur = time(NULL); /*current time*/
runTimeCal = timeCur - stat.btime;
/* printf("timeCur = %ld, btime = %ld \n", timeCur, stat.btime); */
int day;
int h;
int m;
int s;
day = runTimeCal/(24*60*60);
runTimeCal %= 24*60*60;
h = runTimeCal/(60*60);
runTimeCal %= 60*60;
m = runTimeCal/60;
s = runTimeCal%60;
printf("System run time is %d:%d:%d:%d\n", day, h, m, s);
fclose(fpstat);
/* Short mode */
if (repType == SHORT)
repShort();
/* Long mode */
if (repType == LONG)
repLong(interval, duration);
return 0;
}
/* find string and get string after the first ':' */
char* findstr(char *buf, const char *str, char c)
{
char *result;
char *pstr;
if((pstr = strstr(buf, str)) != NULL){ //finded str
result = strchr(pstr, c);
result++;
return result;
}
return NULL;
}
void repShort(void)
{
FILE *thisProcFile;
time_t cpuUser, cpuSys, cpuIdle;
char lineBuf[LB_SIZE];
char *p;
if ((thisProcFile = fopen("/proc/stat", "r")) == NULL) {
fprintf(stderr, "Can not open /proc/stat!\n");
exit(-1);
}
/* cpu time */
fscanf(thisProcFile, "%*s%s", lineBuf);
cpuUser = atol(lineBuf);
fscanf(thisProcFile, "%*s%s", lineBuf);
cpuSys = atol(lineBuf);
fscanf(thisProcFile, "%s", lineBuf);
cpuIdle = atol(lineBuf);
printf("Cpu time is %lds in user, %lds in system, %lds in idle.\n",
cpuUser, cpuSys, cpuIdle);
/* cpu context */
while (!feof(thisProcFile)) {
fgets(lineBuf, LB_SIZE-1, thisProcFile);
if ((p=findstr(lineBuf, "ctxt", ' ')) != NULL) {
printf("cpu change context is %s\n", p);
}
if ((p=findstr(lineBuf, "btime", ' ')) != 0) {
time_t bootTime = atol(p);
printf("system boot time is %s\n", ctime(&bootTime));
}
if ((p=findstr(lineBuf, "processes", ' ')) != 0) {
printf("processes number is %d\n", atoi(p));
break;
}
} /* end while */
fclose(thisProcFile);
/* disk require */
if ((thisProcFile = fopen("/proc/diskstats", "r")) == NULL) {
fprintf(stderr, "Can not read /prc/diskstats");
exit(-1);
}
while (!feof(thisProcFile)) {
fgets(lineBuf, LB_SIZE-1, thisProcFile);
if ((p=findstr(lineBuf, "sda", ' ')) != 0) {
long rt, wt;
sscanf(p, "%ld", &rt);
sscanf(p, "%*ld%*ld%*ld%*ld%ld", &wt);
printf("rt = %ld, wt = %ld\n", rt, wt);
printf("disk read time plus write time is %ld\n", (rt+wt));
break;
}
} /* end while */
fclose(thisProcFile);
}
void repLong(int interval, int duration)
{
FILE *thisProcFile;
char lineBuf[LB_SIZE];
char *p;
if ((thisProcFile = fopen("/proc/meminfo", "r")) == NULL) {
fprintf(stderr, "Can not open /proc/meminfo\n");
exit(-1);
}
int i;
for (i = 1; i <= 2; i++) {
fgets(lineBuf, LB_SIZE-1, thisProcFile);
printf("%s\n", lineBuf);
} /* end for */
fclose(thisProcFile);
/* load average */
/* 求高手指教了,我现在还想不到什么办法求这个平均负载:(
* 这个是要求在程序开始后,600秒后每隔10秒计算一次平均负载
* 等我想到办法再来更新吧!呵呵 。。。
* printf("--------------------load average-------------------------\n");
* if ((thisProcFile = fopen("/proc/
*/
}
阅读(1888) | 评论(0) | 转发(0) |