Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259301
  • 博文数量: 91
  • 博客积分: 4185
  • 博客等级: 上校
  • 技术积分: 855
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-29 16:18
文章分类

全部博文(91)

文章存档

2014年(3)

2013年(1)

2012年(8)

2011年(2)

2010年(5)

2009年(68)

2008年(4)

我的朋友

分类: LINUX

2008-12-07 12:10:55

开始学习 《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) |
0

上一篇:没有了

下一篇:大四上,找工作啦

给主人留下些什么吧!~~