【操作系统】实验二 Proc文件系统

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

文章目录

  • 实验二
    • 实验内容
    • 实验过程
    • 实验小结

实验二

实验内容

  1. 实验名称:Proc文件系统

  2. 实验目的:学习Linux内核、进程、存储和其他资源的一些重要特征。读/proc/stat文件,计算并显示系统CPU占用率和用户态CPU占用率。(编写一个程序使用/proc机制获得以及修改机器的各种资源参数。需要使用fopen(),fscanf(),printf())

  3. 实验任务:学习和掌握proc文件系统的功能、工作原理及其应用

实验过程

  1. 以超级用户的身份进入/proc目录,在终端上键入ls命令,察看该目录下的内容,同时察看每个文件的读写权限,如图1所示。

    图1 查看/proc目录

  2. 选择一台机器,试着回答下列问题:
    CPU的类型和型号,如图2所示。

    图2 查看CPU型号
    所使用的Linux的版本,如图3所示。

    图3 查看Linux版本
    从启动到当前时刻经过的时间,如图4所示。

    图4 查看时间
    内存状态,如图5所示。

图5 查看内存状态
3. 编码

  • 编写一个程序,用来获得内核参数(任意的参数均可)。
  • 编写一个程序,用来修改内核参数(任意的参数均可)。

两个任务我放到一个程序中,既可以获取参数又可以修改参数,由于内核参数太过重要不敢轻易修改,所以我找到网络信息最大连接数来修改,这样就不会太过影响机器,获取当前的网络信息最大连接数并修改它:

网络信息的最大连接数是一个相对概念,它取决于使用的网络设备和协议。在计算机网络中,最大连接数通常指的是某个网络设备(如路由器、交换机、防火墙等)所能同时支持的最大连接数,如图6所示。


图6 查看最大连接数

代码:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>#define MAX_BUF_SIZE 256int get_max_connections() {FILE *fp;char buf[MAX_BUF_SIZE];int max_connections;// 打开/sys文件系统中的内核参数文件fp = fopen("/proc/sys/net/core/somaxconn", "r");if (fp == NULL) {perror("打开文件失败");return -1;}// 读取最大连接数fgets(buf, sizeof(buf), fp);// 转换为整数max_connections = atoi(buf);// 关闭文件fclose(fp);return max_connections;
}int set_max_connections(int max_connections) {FILE *fp;// 打开/sys文件系统中的内核参数文件fp = fopen("/proc/sys/net/core/somaxconn", "w");if (fp == NULL) {perror("打开文件失败");return -1;}// 将最大连接数写入文件fprintf(fp, "%d", max_connections);// 关闭文件fclose(fp);return 0;
}int main() {int max_connections;// 获取当前最大连接数max_connections = get_max_connections();if (max_connections == -1) {return 1;}printf("当前最大连接数: %d\n", max_connections);// 修改最大连接数为新的值if (set_max_connections(1000) == -1) {return 1;}printf("最大连接数已修改为: 1000\n");return 0;
}
  1. 使用man命令了解/proc/stat文件的内容和格式,如图7所示。
    man proc

    图7 查看man命令

  2. 使用man命令了解下列函数的使用方法,如图8~10所示。
    fopen:
    原型:FILE *fopen( const char *filename, const char *mode );
    以打开一个流(文件)。filename——文件名,mode——访问许可类型。

    图8 查看fopen
    fscanf:
    原型:int fscanf( FILE *stream, const char *format [, argument ]… );
    从流中读取格式化的数据。
    例子fscanf (fp ,“cpu %ld”, &user)是指跳过字符串"cpu "及其前面的字符流,读取一个长整数并存入user中。其中fp为文件流指针。%ld对应长整数,%d对应整数,%s对应字符串。

    图9 查看fscanf
    fclose:
    原型:int fclose( FILE *stream );
    关闭流(文件)。

    图10 查看fclose

  3. 用c语言编程,如图11所示。
    总CPU时间= 用户占用时间+系统占用时间+优先进程占用时间+闲置进程占用时间
    系统CPU占用率 = 系统占用时间 / 总CPU时间
    用户态CPU占用率 = 用户占用时间 / 总CPU时间

代码:

#include <stdio.h>
#include <unistd.h>unsigned long long get_cpu_time() {unsigned long long user, nice, system, idle;// 读取/proc/stat文件中的CPU时间信息FILE* file = fopen("/proc/stat", "r");fscanf(file, "cpu %llu %llu %llu %llu", &user, &nice, &system, &idle);fclose(file);return user + nice + system + idle;
}
int main() {unsigned long long prev_total_time = 0, prev_user_time = 0;double system_cpu_usage, user_cpu_usage;while (1) {// 获取当前的CPU时间信息total_time = get_cpu_time();user_time = total_time - get_cpu_time();// 计算系统CPU占用率和用户态CPU占用率if (prev_total_time != 0) {system_cpu_usage = (double)(total_time - prev_total_time - (user_time - prev_user_time)) / (total_time - prev_total_time);user_cpu_usage = (double)(user_time - prev_user_time) / (total_time - prev_total_time);printf("系统CPU占用率:%.2f%%\n", system_cpu_usage * 100);printf("用户态CPU占用率:%.2f%%\n", user_cpu_usage * 100);}prev_total_time = total_time;prev_user_time = user_time;sleep(1);  // 每隔1秒钟更新一次CPU时间信息}return 0;
}

编译和运行

图11 运行程序显示结果

实验小结

问题:
1.在修改内核参数的时候发现很多都不能修改,需要root权限
注意事项:

  1. 不要随便修改内核参数,可能会导致机器出现莫名的问题
    提高的能力:
  2. 编码能力有待提高
  3. 对命令的熟悉度有待提高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/421891.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全的信息收集方法有哪些?

网络安全攻击中的信息收集是攻击者为了了解目标系统的弱点、配置、环境和潜在的防御措施而进行的活动。以下是一些常见的信息收集手段&#xff1a; 开放网络资源查询&#xff1a; 使用搜索引擎查找关于目标组织的信息&#xff0c;包括新闻稿、社交媒体帖子、官方网站等。通过W…

【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录 一、sort 1.1sort简介 语法 参数 功能 适用容器 1.2sort的用法 1.3自定义比较函数 示例 1265蓝桥题 —— 排序 二、min和max函数 三、min_element和max_element 497蓝桥题 —— 成绩分析 四、nth_element 一、sort 1.1sort简介 sort函数包含在头文件<a…

用户洞察:精准解读用户的真实需求!

洞察用户需求的过程和谈恋爱一样。你不能简简单单地问客户&#xff0c;你想要什么&#xff1f;你有什么痛点&#xff1f;这样的问法是无法得到任何有价值的信息。这就好比谈恋爱的场景&#xff0c;如果你问对方想吃什么&#xff0c;大概率会得到“随便”“都行”这类的答案&…

计算机网络学习first day

In the first day.  首先&#xff0c;我们要先有清晰地学习思路&#xff0c;然后介绍计算机网络的发展及在信息时代的各类应用及带来的一些负面问题。然后是对因特网进行概述&#xff0c;包括网络&#xff0c;互联网和因特网的相关概念&#xff0c;因特网发展的三个历史阶段&a…

python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

一、利用直方图的方式进行批量的图片缺陷检测&#xff08;方法简单&#xff09; 二、步骤&#xff08;完整代码见最后&#xff09; 2.1灰度转换&#xff08;将原图和要检测对比的图分开灰度化&#xff09; 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

基于SpringBoot的SSM整合案例

项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

最新多线程版 FFmpeg 剖析

FFmpeg近期推出了一个重要Feature&#xff0c;即将原来的 FFmpeg 命令行工具由单线程变成了多线程。 ffmpeg -i input.mp4 -c:v libx264 -crf 23 out.mp4 如上面的命令&#xff0c;以前使用上面命令进行转码时&#xff0c;由于它是单线程工作模式&#xff0c;因此只能利用一个…

写一个简单的python服务测试

1&#xff1a;引用sanic pip install sanic 2: 引用sanic 跨域 3&#xff1a; #-*- coding: UTF-8 -*- # !/usr/bin/python # time :2022/2/22 21:43 # author :Mo # function :get/post of sanicfrom sanic.response import json, text from sanic import Sanic, req…

vs2022配置OpenCV测试

1&#xff0c;下载Opencv安装包 OpenCV官网下载地址&#xff1a;Releases - OpenCV 大家可以按需选择版本进行下载&#xff0c;官网下载速度还是比较慢的&#xff0c;推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…

AI 欺诈事件频出,如何重塑身份认证的安全性?

据报告表示&#xff0c;生成式人工智能每年可为世界经济注入相当于 4.4 万亿美元的资金。预计到 2030 年&#xff0c;人工智能对全球财政的潜在贡献将达到 15.7 万亿美元。人们惊叹于 AI 强大工作效率&#xff0c;期待能帮忙节省不必要的劳动力&#xff0c;但事实上 AI 出现之后…