本文共 3158 字,大约阅读时间需要 10 分钟。
1、实验目的
学习 linux 内核、进程、存储和其他资源的一些重要特性。通过使用/proc 文件系统接口,编写一个程序检查反映机器平衡负载、进程资源利用率方面的各种内核值, 学会使用/proc文件系统这种内核状态检查机制。
2、实验内容
编写一个默认版本的程序通过检查内核状态报告 Linux 内核行为。
程序应该在stdout上打印以下值:
1、CPU 类型和型号;
2、所使用的 Linux 内核版本;
3、从系统最后一次启动以来已经经历了多长时间(天,小时和分钟);
4、总共有多少 CPU 时间执行在用户态,系统态,空闲态;
5、配置内存数量;当前可用内存数,磁盘读写请求数;
6、内核上下文转换数。
3、实验基础
(1) 使用w命令查看登录用户正在使用的进程信息
w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。
输出的信息包括:
$ w
$ w –h
$ w –u
$ w –s
(2)使用who命令查看(登录)用户名称及所启动的进程
who命令用于列举出当前已登录系统的用户名称。
$ who
$ users
(3) 使用whoami命令查看你所使用的登录名称
whoami命令用于显示登入的用户名。
$ whoami
$ id –un
(4)查看系统的信息
last命令可用于显示特定用户登录系统的历史记录。
该命令的输出结果包含以下几列信息:
用户名称、tty设备号、历史登录时间日期、登出时间日期、总工作时间
$ last Jason
$ cal
$ find –name “”
(5) /proc
cat /proc/cpuinfo ? #CPU的类型和型号
cat /proc/version ? #使用的Linux内核版本、编译器版本
cat /proc/meminfo ? #配置了多少内存
cat /proc/meminfo ? #当前有多少可用内存
cat /proc/stat ? #有多少磁盘读写请求;从系统启动以来已经创建了多少进程
(图略)
4、实验过程
编写一个默认版本的程序通过检查内核状态报告 Linux 内核行为
1、CPU 类型和型号;
2、所使用的 Linux 内核版本;
3、从系统最后一次启动以来已经经历了多长时间(天,小时和分钟);
4、总共有多少 CPU 时间执行在用户态,系统态,空闲态;
5、配置内存数量;当前可用内存数,磁盘读写请求数;
6、内核上下文转换数。
程序如下:
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
char repTypeName[16];
char c1, c2, ch;
int interval, duration;
char *lineBuf;
int LB_SIZE = 255; // 设置最大长度
FILE *thisProcFile;
struct timeval now; // 更正类型
int iteration;
lineBuf = (char *)malloc(sizeof(char) * LB_SIZE); // 分配空间
interval = 2; // 初始化参数
duration = 60;
strcpy(repTypeName, "Standard");
if(argc > 1) { // 更正, Linux下argc至少为1, 故改为 > 1, 即没有参数时越过
sscanf(argv[1], "%c%c", &c1, &c2);
if(c1 != '-') {
fprintf(stderr, "usage: ksamp [-s][-l int dur]n");
exit(1);
}
if(c2 == 's')
strcpy(repTypeName, "Short");
if(c2 == 'l') {
strcpy(repTypeName, "Long");
interval = atoi(argv[2]);
duration = atoi(argv[3]);
}
}
// 获取时间
gettimeofday(&now, NULL);
printf("Status report %s at %sn", repTypeName, ctime(&(now.tv_sec)));
// 更正ctime函数调用
// 读取hostname
thisProcFile = fopen("/etc/hostname", "r");
memset(lineBuf, 0, LB_SIZE); // 初始化lineBuf
fgets(lineBuf, LB_SIZE - 1, thisProcFile);
printf("Machine hostname: %sn", lineBuf);
fclose(thisProcFile);
// 读取版本信息
thisProcFile = fopen("/procersion", "r");
memset(lineBuf, 0, LB_SIZE);
fgets(lineBuf, LB_SIZE - 1, thisProcFile);
printf("The Version: %sn", lineBuf);
fclose(thisProcFile);
// 读取CPU信息
thisProcFile = fopen("/procuinfo", "r");
memset(lineBuf, 0, LB_SIZE);
fgets(lineBuf, LB_SIZE - 1, thisProcFile);
printf("The Cpu: %sn", lineBuf);
fclose(thisProcFile);
// 读取当前时间
thisProcFile = fopen("/proc/uptime", "r");
memset(lineBuf, 0, LB_SIZE);
fgets(lineBuf, LB_SIZE - 1, thisProcFile);
printf("The Running Time: %sn", lineBuf);
fclose(thisProcFile);
// 读取内存信息
printf("The MemInfo: ");
thisProcFile = fopen("/proc/meminfo", "r");
while(!feof(thisProcFile)) {
putchar(fgetc(thisProcFile));
}
fclose(thisProcFile);
// 当前状况
printf("The Status: ");
thisProcFile = fopen("/proc/stat", "r");
while(!feof(thisProcFile)) {
putchar(fgetc(thisProcFile));
}
fclose(thisProcFile);
iteration = 0;
while(iteration < duration) {
sleep(interval);
thisProcFile = fopen("/proc/loadavg", "r");
while(!feof(thisProcFile)) {
putchar(fgetc(thisProcFile));
}
fclose(thisProcFile);
iteration += interval;
}
return 0;
}
运行结果如下:
转载地址:https://blog.csdn.net/weixin_33682804/article/details/116660650 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!