操作系统实验二

实验二 观察Linux行为,使用proc文件系统

一、实验目的

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

二、实验内容

Part A

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

选择一台机器,试着回答下列问题:

  • CPU的类型和型号。

  • 所使用的Linux的版本。

  • 从启动到当前时刻经过的时间。

  • 内存状态。

Part B

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

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

三、实验步骤

  1. 使用man命令了解/proc/stat文件的内容和格式:

    man proc
    
  2. 使用man命令了解下列函数的使用方法:

    fopen:

    // 原型如下
    FILE *fopen( const char *filename, const char *mode );
    // 以打开一个流(文件)。filename——文件名,mode——访问许可类型。
    

    fscanf

    // 原型如下
    int fscanf( FILE *stream, const char *format [, argument ]);
    // 从流中读取格式化的数据。
    

    fclose

    // 原型如下:
    int fclose( FILE *stream );
    // 关闭流(文件)。
    
  3. 用c语言编程

    首先编写主函数,建立程序的基本框架,将实现功能的函数放在头文件info.h

    #include<stdio.h>
    #include "func.h" // functions insidevoid extra() {while (1) {printf("Please select from those numbers below:");printf("\n1:CPU INFO\n2:Linux VERSION INFO\n3:SYSTEM TIME INFO\n4:RAM INFO\n5:sumCpuTime\n"); // some attention infoint order = 0; // flagwhile (order = getchar()) {// printf("%d\n", order);switch (order) {case 49:cpuInfo();break;case 50:linuxVersion();break;case 51:sysTime();break;case 52:ramInfo();break;case 53:sumCpuTime();break;}}}
    }
    int main(int argc, char *argv[]) {extra();printf("\nCopy that, over!");
    }
    

    对于文件info.h

    定义保存文件的字符数组shell以及文件指针ptr

    char shell[100]; // the order
    FILE *ptr = NULL; // file ptr
    

    初始化数组

    void initShell() {memset(shell, 0, sizeof(shell));
    }
    

    初始化文件指针

    void initPtr() {ptr = NULL;
    }
    

    编写函数linuxVersion()显示系统信息

    /** To get info about Linux version and print*/
    void linuxVersion() {ptr = fopen("/proc/version", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("Linux version info:%s", shell); // disp the info}fclose(ptr); // close fileinitPtr(); // init pointerinitShell(); // init order array}
    }
    

    编写函数cpuInfo()读取CPU信息

    /** To get info about CPU and print*/
    void cpuInfo() {ptr = fopen("/proc/cpuinfo", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("%s", shell); // disp the info}fclose(ptr);initPtr();initShell();}
    }
    

    编写函数sysTime()读取系统信息

    首先定义三个宏保存一天、一小时、一分钟等价秒数(其实按照C的编写要求更应该使用const int类型变量)

    #define DAY 86400
    #define HOUR 3600
    #define MINUTE 60
    

    函数主体如下

    /** To get info how long the OS' running time*/
    void sysTime() {int t; // t means timeint d, h, m, s; // days, hours, minutes, secondsptr = fopen("/proc/uptime", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {fscanf(ptr, "%d", &t);// down side here are focusing on format the time we gotd = t / DAY;t = t % DAY;h = t / HOUR;t = t % HOUR;m = t / MINUTE;t = t % MINUTE;s = t;printf("Time info:%02ddays:%02dhours:%02dminutes:%02dseconds\n", d, h, m, s); // disp the info}fclose(ptr);initPtr();
    }
    

    编写函数ramInfo()读取内存信息

    /** To get info about ram*/
    void ramInfo() {ptr = fopen("/proc/meminfo", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("Ram info:%s", shell); // disp the info}fclose(ptr);initPtr();initShell();}
    }
    

    编写函数sumCpuTime()计算:

    • 总CPU时间 = 用户占用时间+系统占用时间+优先进程占用时间+闲置进程占用时间
    • 系统CPU占用率 = 系统占用时间 / 总CPU时间
    • 用户态CPU占用率 = 用户占用时间 / 总CPU时间
    void sumCpuTime() {char cpu[10];long user, nice, sys, idle, iowait, irq, softirq, total; // user_using, sys_using,float sys_usage, user_usage;ptr = fopen("/proc/stat", "r");if (ptr == NULL) {printf(("Got nothing"));} else {// only the first line will be usefgets(shell, sizeof(shell), ptr);printf("cpu time info:%s\n", shell);sscanf(shell, "%s%ld%ld%ld%ld%ld%ld%ld", cpu, &user, &nice, &sys, &idle, &iowait, &irq, &softirq);total = user + nice + sys + idle + iowait + irq + softirq; // total timesys_usage = (float)sys / (float)total;user_usage = (float)user / (float)total;printf("总时间:%ld", total);printf("系统使用时间占比:%.3f%\n", sys_usage * 100);printf("用户使用时间占比:%.3f%\n", user_usage * 100);}
    }
    

    info.h完整结构如下

    //
    // Created by lunatic on 2020/10/17.
    //
    #include <string.h>
    #ifndef HOMEWORK2_FUNC_H
    #define HOMEWORK2_FUNC_H
    #define DAY 86400
    #define HOUR 3600
    #define MINUTE 60char shell[100]; // the order
    FILE *ptr = NULL; // file ptrvoid initShell() {memset(shell, 0, sizeof(shell));
    }void initPtr() {ptr = NULL;
    }/** To get info about Linux version and print*/
    void linuxVersion() {ptr = fopen("/proc/version", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("Linux version info:%s", shell); // disp the info}fclose(ptr); // close fileinitPtr(); // init pointerinitShell(); // init order array}
    }/** To get info about CPU and print*/
    void cpuInfo() {ptr = fopen("/proc/cpuinfo", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("%s", shell); // disp the info}fclose(ptr);initPtr();initShell();}
    }/** To get info how long the OS' running time*/
    void sysTime() {int t; // t means timeint d, h, m, s; // days, hours, minutes, secondsptr = fopen("/proc/uptime", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {fscanf(ptr, "%d", &t);// down side here are focusing on format the time we gotd = t / DAY;t = t % DAY;h = t / HOUR;t = t % HOUR;m = t / MINUTE;t = t % MINUTE;s = t;printf("Time info:%02ddays:%02dhours:%02dminutes:%02dseconds\n", d, h, m, s); // disp the info}fclose(ptr);initPtr();
    }/** To get info about ram*/
    void ramInfo() {ptr = fopen("/proc/meminfo", "r"); // open the sourceif (ptr == NULL) {printf("Got nothing");} else {while (1) {if (fgets(shell, 512, ptr) == NULL) { // if the string ended, breakbreak;}printf("Ram info:%s", shell); // disp the info}fclose(ptr);initPtr();initShell();}
    }void sumCpuTime() {char cpu[10];long user, nice, sys, idle, iowait, irq, softirq, total; // user_using, sys_using,float sys_usage, user_usage;ptr = fopen("/proc/stat", "r");if (ptr == NULL) {printf(("Got nothing"));} else {// only the first line will be usefgets(shell, sizeof(shell), ptr);printf("cpu time info:%s\n", shell);sscanf(shell, "%s%ld%ld%ld%ld%ld%ld%ld", cpu, &user, &nice, &sys, &idle, &iowait, &irq, &softirq);total = user + nice + sys + idle + iowait + irq + softirq; // total timesys_usage = (float)sys / (float)total;user_usage = (float)user / (float)total;printf("total time:%ld", total);printf("percentage of system time:%f%\n", sys_usage * 100);printf("percentage of user time:%f%\n", user_usage * 100);}
    }
    #endif //HOMEWORK2_FUNC_H

    编写程序,实现一次性查看/proc下的多个文件

    //
    // Created by Lunatic on 2020/11/25.
    //
    #include <stdio.h>int main(int argc, char *argv[]) {char buffer[100];FILE *fp;int i = 1;for (; 1; i++) {if (argc[1] == NULL) {printf("There's no file out there");return 0;}fp = fopen(argv[1], "r");if (fp == NULL) {printf("File could not be opened\n");} else {while (1) {if (fgets(buffer, 100, fp) == NULL) {break;}printf("%s", buffer);}fclose(fp);}}return 0;
    }
    

四、实现结果

使用如下命令进行编译,输出一个名为task的二进制文件

gcc -o task main.c

开始执行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

依次测试各功能:

  1. CPU INFO查看CPU信息

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. Linux VERSION INFO查看Linux版本信息

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. SYSTEM INFO查看本机操作系统系统信息

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. RAM INFO查看内存信息

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. sumCpuTime查看占用事件

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  6. 输入命令读取多个文件

    执行程序,在之后附上命令,查看Linux版本信息

    ./a1 /proc/version /proc/cpuinfo
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五、实验心得

本次实验学习了在Linux如何使用Vim编写程序以及如何调用编译器对编写的程序进行编译。Linux的文件均存放在/proc目录下,在用户态下进行编程,使用文件指针读取文件即可查看相关的文件信息。

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

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

相关文章

安卓上使用免费的地图OpenStreetMap

前一段使用了微信的地图&#xff0c;非常的好用。但是存在的问题是海外无法使用&#xff0c;出国就不能用了&#xff1b; 其实国内三家&#xff1a;百度&#xff0c;高德&#xff0c;微信都是一样的问题&#xff0c;当涉及到商业使用的时候需要付费&#xff1b; 国外除了谷歌…

51单片机介绍

1 单片机简介 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设…

2.6 KERNEL LAUNCH

图2.15在vecAdd函数中显示最终主机代码。此源代码完成了图2.6.中的骨架。2.12和2.15共同说明了一个简单的CUDA程序&#xff0c;该程序由主机代码和设备内核组成。该代码是硬接的&#xff0c;每个线程块使用256个线程。然而&#xff0c;使用的线程块的数量取决于向量&#xff08…

jenkins通过流水线自动部署项目(k8s部署)

参考&#xff1a;https://www.cnblogs.com/rb2010/p/16195443.html docker 拉取镜像到本地&#xff1a; docker pull docker.io/jenkins/jenkins:2.164配置卷挂载&#xff1a;使用nfs 参考&#xff1a;https://www.kuboard.cn/learning/k8s-intermediate/persistent/nfs.htm…

指针传参误区

C语言中指针作为形参传递时&#xff0c;func&#xff08;*a, *b&#xff09; 这种形式的话&#xff0c;是无法通过简单的 ab来修改的&#xff0c;在函数体内a的地址确实被修改成b的地址了&#xff0c;但是当函数执行结束时&#xff0c;a的地址会重新回到原本的地址里面&#xf…

卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集

解决任何真实问题的重要一步是获取数据&#xff0c;Kaggle提供了大量不同数据科学问题的竞赛。 我们将从 https://www.kaggle.com/competitions/dogs-vs-cats/data 下载猫狗数据集&#xff0c;并对其进行一定的操作&#xff0c;以正确的导入到我们的计算机&#xff0c;为接下…

四 视图

1、实验目的 理解SQL成熟设计基本规范&#xff0c;能够熟练使用SQL语句来创建需要的视图&#xff0c;定义数据库外模式&#xff0c;并能使用所创建的视图实现数据管理。 2、实验内容及要求 使用SQL对数据库进行各类查询数据操纵操作&#xff0c;掌握单行数据插入、多行数据插…

设计模式的艺术P1基础—第1章 概述

刘伟&#xff0c;2020 概述&#xff1a;4部分&#xff0c;26章。 P1:基础&#xff08;1-2章&#xff09; P2:创建型设计模式&#xff08;创建艺术&#xff0c;3-8章&#xff09; P3:结构型设计模式&#xff08;组合艺术&#xff0c;9-15章&#xff09; P4:行为型设计模式&…

2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法 1.概念 工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类&#xff0c;工厂方法让类的实例化推迟到子类中进行。 在工厂方法模式中用户只需要关心所需产品对应的工厂&#xff0c;…

AUTOSAR开发文档

目录 目录 状态机电源管理开发... I 文档... I 1. 综述... 1 2. 系统硬件架构图... 1 3. 状态机设计方案... 2 4. 电源管理方案... 4 综述 本文档主要描述了MCU芯片TC297的AUTOSAR方案。MCU的基础软件由AUTOSAR软件实现&#xff0…

嵌入式——循环队列

循环队列 (Circular Queue) 是一种数据结构(或称环形队列、圆形队列)。它类似于普通队列,但是在循环队列中,当队列尾部到达数组的末尾时,它会从数组的开头重新开始。这种数据结构通常用于需要固定大小的队列,例如计算机内存中的缓冲区。循环队列可以通过数组或链表实现,…

微信小程序实战-01翻页时钟-1

文章目录 前言需求分析功能设计界面设计界面结构设计界面样式设计 逻辑设计 单页功能实现运行结果 前言 我经常在手机上用的一款app有一个功能是翻页时钟&#xff0c;基于之前学习的小程序相关的基础内容&#xff0c;我打算在微信小程序中也设计一个翻页时钟功能&#xff0c;J…

大模型实战营Day2 作业

基础作业 1 使用 InternLM-Chat-7B 模型生成 300 字的小故事 2 熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地 进阶作业 1 完成浦语灵笔的图文理解及创作部署 2 完成 Lagent 工具调用 Demo…

大数据计算基础真题回忆

转载学长20 21的真题 转载链接 注&#xff1a;每年的课件可能会有更改&#xff0c;内容不一样&#xff0c;所以读者复习的时候以所在年份的课件为准 2020 ​ 2021 笔者2023秋 2023 都是大题&#xff0c;没有选择题。 改进的近似算法中&#xff0c;结合具体的例子说明&am…

【Linux】Linux系统编程——Linux命令解析器

【Linux】Linux系统编程——Linux命令解析器 什么是Linux 命令解析器&#xff1f; Linux 命令解析器&#xff0c;通常被称为 shell&#xff0c;是 Linux 操作系统中的一个关键组件。它充当用户和系统内核之间的接口&#xff0c;允许用户通过输入命令来控制和管理操作系统和应…

计算机丢失mfc140.dll怎么办?解决mfc140.dll缺失的3种方法分享

计算机丢失mfc140.dll怎么办&#xff1f;在使用微软办公软件的时候&#xff0c;可能会弹出一个错误提示框说“找不到mfc140.dll&#xff0c;无法继续执行代码”。为了不影响工作效率&#xff0c;我们可能需要亲自动手尝试修复这一问题。以下是一些mfc140.dll缺失的3种方法相关介…

LED显示屏控制卡常见问题详解

LED显示屏控制卡是LED图文显示屏的关键组件&#xff0c;主要负责接收来自计算机串行口的图像显示信息&#xff0c;将其放入帧存储器&#xff0c;并按照分区驱动方式生成LED显示屏所需的串行显示数据和扫描控制时序。带你5分钟了解LED显示屏控制系统。本文将针对LED显示屏控制卡…

2024最新外贸建站:ChemiCloud主机购买使用及自建外贸独立站教程

随着电商平台竞争的加剧&#xff0c;许多外贸从业者意识到减少对平台依赖的重要性&#xff0c;并选择搭建自己的外贸独立站来获得更多的控制权和灵活性。即使是没有建站基础的新手&#xff0c;也可以通过学习建站来实现这一目标。下面是一个适用于新手的外贸建站教程&#xff0…

Spring AOP概念

什么是 AOP &#xff1f; AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是 Spring …

请问下大家PMP证书值得考嘛?

做项目的去考&#xff0c;项目经理、产品经理这些&#xff0c;或者有往项目管理领域发展的去考。其他行业有空可以学习下 不一定要考证了。 PMP证书更多的是“敲门砖”作用&#xff0c;大部分公司招聘的门槛都要去了这个证书。 当然现在PMP管理模式也很热门&#xff0c;各大企…