通过proc文件系统观察整个Linux内核和系统的一些重要特征,并编写一个程序,使用proc文件系统获得以及修改系统的各种配置参数。
本实验需要学生具有Linux的基本操作技能,以及采用C语言编写程序的能力。
以超级用户的身份登录Linux系统,并进入/proc目录,键入“ls”命令,查看该目录下的内容,同时查看每个文件的读写权限。
1、请回答下列问题:
CPU的类型和型号。
首先进入/proc目录,使用ls命令查看目录下内容,
再通过cat cpuinfo命令查看cpu的类型和型号
所使用的Linux的版本。
使用cat version命令查看Linux版本
从启动到当前时刻所经过的时间。
使用cat uptime命令查看从启动到当前时刻所经过的时间
当前内存状态。
使用cat meminfo命令查看内存状态
2、编写一个程序getinfo.c,编译后并在命令行带命令参数来运行该程序,获得内核参数 (例如网络主机名、共享内存容量、文件句柄的最大参数等) 在屏幕上显示出来。
运行过程实例如下(获取文件句柄最大参数):
[root@Linux / ]# ./getinfo filemax
filemax :18626
程序设计
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]){
if(argc != 2){
printf("Usage: %s \n" , argv[0]);
return 1;
}
char path[50] = "/proc/sys/fs/";
strcat(path, argv[1]);
int fd = open(path, O_RDONLY);
if(fd == -1){
perror("open error");
return 1;
}
char buffer[150];
int size = read(fd, buffer, sizeof(buffer));
if(size == -1){
perror("read error");
close(fd);
return 1;
}
buffer[size] = '\0';
close(fd);
printf("%s: %s", argv[1], buffer);
return 0;
}
程序分析
该程序是一个简单的Linux系统命令行程序,可以读取系统内核中的某些参数值,并将其输出到控制台上。
首先,该程序会判断输入的参数个数是否为2,如果不是则输出“Usage: 程序名 ”,并返回1表示错误。如果参数个数正确,则会将参数值加到一个字符串中,并在字符串开头加上“/proc/sys/fs/”,得到一个表示内核参数文件的路径。
接着,该程序会使用open函数打开所得到的文件路径,并返回一个文件描述符。如果open函数返回值为-1,则说明打开文件失败,这时程序会输出一个错误信息,并返回1表示错误。
接下来,程序使用read函数从文件中读取数据,并将数据存储到一个字符数组中。如果read函数返回值为-1,则说明读取文件失败,程序会输出一个错误信息,关闭文件,并返回1表示错误。否则,程序将读取的数据末尾添加一个空字符,关闭文件,将读取到的数据输出到控制台上,完成程序功能。
总体来说,该程序使用了open、read和close等系统调用函数,实现了一个简单的读取内核参数的命令行工具。
运行结果
3、编写一个程序setsys.c,编译后并在命令行带命令参数来运行该程序,用来修改内核参数(任意的参数均可(例如网络主机名、共享内存容量、文件句柄的最大参数等)。
运行过程实例如下:
[root@Linux / ]# ./setsys filemax
Input filemax parameter:21545
注释:实例中加波浪线的部分为键盘输入内容。通过运行getinfo filemax来确认是否修改成功。
程序设计
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]){
if(argc != 2){
printf("Usage: %s \n" , argv[0]);
return 1;
}
char path[50] = "/proc/sys/fs/";
strcat(path, argv[1]);
int fd = open(path, O_WRONLY);
if(fd == -1){
perror("open error");
return 1;
}
printf("Input %s parameter: ", argv[1]);
char buffer[20];
fgets(buffer, sizeof(buffer), stdin);
if(write(fd, buffer, strlen(buffer)) == -1){
perror("write error");
close(fd);
return 1;
}
close(fd);
printf("Set %s parameter to: %s", argv[1], buffer);
return 0;
}
程序分析
该程序是一个简单的Linux系统命令行程序,可以设置系统内核中的某些参数值。
程序的第一步是判断输入的参数个数是否为2,如果不是则输出“Usage: 程序名 ”,并返回1表示错误。如果参数个数正确,则会将参数值加到一个字符串中,并在字符串开头加上“/proc/sys/fs/”,得到一个表示内核参数文件的路径。
接着,程序使用open函数打开所得到的文件路径,并返回一个文件描述符。如果open函数返回值为-1,则说明打开文件失败,这时程序会输出一个错误信息,并返回1表示错误。
接下来,程序会提示用户输入要设置的参数值,使用fgets函数读取用户的输入,并将用户输入的字符串写入内核参数文件中。如果write函数返回值为-1,则说明写入文件失败,程序会输出一个错误信息,关闭文件,并返回1表示错误。否则,程序将关闭文件,并输出设置后的参数值,完成程序功能。
总体来说,该程序使用了open、write和close等系统调用函数,实现了一个简单的设置内核参数的命令行工具。
运行结果