【操作系统】实验一 Linux初步

2023-09-21 21:38:08

Linux初步

一、实验目的

通过proc文件系统观察整个Linux内核和系统的一些重要特征,并编写一个程序,使用proc文件系统获得以及修改系统的各种配置参数。
本实验需要学生具有Linux的基本操作技能,以及采用C语言编写程序的能力。

二、实验内容

以超级用户的身份登录Linux系统,并进入/proc目录,键入“ls”命令,查看该目录下的内容,同时查看每个文件的读写权限。
1、请回答下列问题:

  • CPU的类型和型号。
    首先进入/proc目录,使用ls命令查看目录下内容,
    再通过cat cpuinfo命令查看cpu的类型和型号
    1
    2

  • 所使用的Linux的版本。
    使用cat version命令查看Linux版本
    3

  • 从启动到当前时刻所经过的时间。
    使用cat uptime命令查看从启动到当前时刻所经过的时间
    4

  • 当前内存状态。
    使用cat meminfo命令查看内存状态
    5

2、编写一个程序getinfo.c,编译后并在命令行带命令参数来运行该程序,获得内核参数 (例如网络主机名、共享内存容量、文件句柄的最大参数等) 在屏幕上显示出来。
运行过程实例如下(获取文件句柄最大参数):
[root@Linux / ]# ./getinfo filemax
filemax :18626

程序设计

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

int main(int argc, char *argv[]){
    if(argc != 2){
        printf("Usage: %s <parameter>\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等系统调用函数,实现了一个简单的读取内核参数的命令行工具。

运行结果

6

3、编写一个程序setsys.c,编译后并在命令行带命令参数来运行该程序,用来修改内核参数(任意的参数均可(例如网络主机名、共享内存容量、文件句柄的最大参数等)。
运行过程实例如下:
[root@Linux / ]# ./setsys filemax
Input filemax parameter:21545
注释:实例中加波浪线的部分为键盘输入内容。通过运行getinfo filemax来确认是否修改成功。

程序设计

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

int main(int argc, char *argv[]){
    if(argc != 2){
        printf("Usage: %s <parameter>\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等系统调用函数,实现了一个简单的设置内核参数的命令行工具。

运行结果

7

更多推荐

WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:js控制绘制点位

js改变点位,动态传值<canvasid="canvas"></canvas><!--顶点着色器--><scriptid="vertexShader"type="x-shader/x-vertex">attributevec4a_Position;voidmain(){//点位gl_Position=a_Positio

<Babel> 前端语言的巴别塔

Babel中文站点:https://www.babeljs.cn/Babel外文站点:https://babeljs.io/什么是BabelBabel取自人类语言最早的传说,TowerofBabel。上帝摧毁了巴别塔上说着共同语言的我们,又被Babel重新带了回来。如果说巴别塔是人们对混乱到秩序的向往,那Babel在前

详细介绍Webpack5中的Loader

loader用于帮助webpack将不同类型的文件转换为webpack可识别的模块。优先级分类pre:前置loadernormal:普通loader,没有用enforce指定就是normalinline:内联loaderpost:后置loaderloader执行顺序pre>normal>inline>post相同优先级

【深度学习】卷积神经网络(LeNet)【文章重新修改中】

卷积神经网络LeNet前言LeNet模型代码实现MINST代码分块解析1构建LeNet网络结构2加载数据集3初始化模型和优化器4训练模型5训练完成完整代码Fashion-MINST代码分块解析1构建LeNet网络结构2初始化模型参数3加载数据集4定义损失函数和优化器5训练模型完整代码参考与更多阅读材料前言全连接神经网络

前端进阶--深入理解JavaScript

1、JS的作用域和作用域链作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是

SpringBatch ItemProcessor详解

ItemProcessor在SpringBatch中用于对每个读取的数据项(item)进行处理或转换。一、ItemProcessor具体功能数据清洗(DataCleansing):清理数据以确保数据的一致性和准确性。这可以包括去除不必要的空格、特殊字符、修复数据格式等。数据转换(DataTransformation):

mongodb语法以及springboot中操作mongodb数据库(query update Criteria的使用)

mongodb语法创建数据库:useDATABASE_NAME创建集合:db.createCollection("COLLECTION_NAME")插入数据:db.COLLECTION_NAME.insert({key:value})查询数据:db.COLLECTION_NAME.find()更新数据:db.COLLE

基于SpringBoot的阿博图书馆管理系统

目录前言一、技术栈二、系统功能介绍管理员功能模块用户功能模块前台首页功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着社会的发展,计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机,通过对图书借阅等信息进行管理。减少管理员的工作,同时也方便广大用户对所需图书借阅

MongoDB索引

索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须扫描集合中的每个文档才能返回查询结果。如果查询存在适当的索引,MongoDB将使用该索引来限制它必须扫描的文档数。尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入都必须更新任何索引。

第四天:gec6818开发板串口蓝牙模块的使用与配置

串口通信串口是一种简单的通信接口,也是单片机中最常用最简单的通信方式通常传感器都是采用串口作为与上位机的通信接口ARM板有三个可外接传感器的串口接口,位于开发板右上角从上到下,分别是串口号串口驱动设备文件CON2“/dev/ttySAC1”CON3“/dev/ttySAC2”CON4“/dev/ttySAC3”将传感器

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找所谓的查找或搜索,指从一组数据对象中找出符合特定条件者,这是构建算法的一种基本而重要的操作。其中的数据对象,统一地表示和实现为词条(entry)的形式;不同词条之间,依照各自的关键码(key)彼此区分。循关键码访问:查找的过程与结果,仅仅取决于目标对象的关键码。词条template<typenameK,typena

热文推荐