linux内核编程实验一

问题 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;
}

你可能感兴趣的:(Linux内核实验)