实验四 PROC文件系统
操作系统课程设计proc文件系统

得到有用的系统/内核信息
proc 文件系统可以被用于收集有用的关于系统和运行中 的内核的信息。下面是一些重要的文件:
• • • • • • • • /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等) /proc/meminfo - 物理内存、交换空间等的信息 /proc/mounts - 已加载的文件系统的列表 /proc/devices - 可用设备的列表 /proc/filesystems - 被支持的文件系统 /proc/modules - 已加载的模块 /proc/version - 内核版本 /proc/cmdline - 系统启动时输入的内核命令行参数
操作系统 课程设计
proc 文件系统
proc
• proc 文件系统是 Linux 中的特殊文件系统,提供 给用户一个可以了解内核内部工作过程的可读窗 口,在运行时访问内核内部数据结构、改变内核 设置的机制。
保存系统当前工作的特殊数据,但并不存在于任何物
理设备中;
对其进行读写时,才根据系统中的相关信息即时生成;
• 同学们在实验课程中重新编译过 Linux 内核, 有些同学可能会发现在内核的配置过程中,有 很多设备驱动程序和其他内核元素都被编译成 了模块。如果一个驱动程序被直接编译到了内 核中,那么即使这个驱动程序没有运行,它的 代码和静态数据也会占据一部分空间。但是如 果这个驱动程序被编译成一个模块,就只有在 需要内存并将其加载到内核时才会真正占用内 存空间。有趣的是,对于 LKM 来说,我们不 会注意到有什么性能方面的差异,因此这对于 创建一个适应于自己环境的内核来说是一种功 能强大的手段,这样可以根据可用硬件和连接 的设备来加载对应的模块。
proc 中的文件远不止上面列出的这么多。想要进一步了 解,可以对 /proc 的每一个文件都'more'一下。
proc 文件系统

什么是proc文件系统?proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。
它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。
由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
它的目录结构如下:目录名称目录内容apm 高级电源管理信息cmdline 内核命令行Cpuinfo 关于Cpu信息Devices 可以用到的设备(块设备/字符设备)Dma 使用的DMA通道Filesystems 支持的文件系统Interrupts 中断的使用Ioports I/O端口的使用Kcore 内核核心印象Kmsg 内核消息Ksyms 内核符号表Loadavg 负载均衡Locks 内核锁Meminfo 内存信息Misc 杂项Modules 加载模块列表Mounts 加载的文件系统Partitions 系统识别的分区表Rtc 实时时钟Slabinfo Slab池信息Stat 全面统计状态表Swaps 对换空间的利用情况V ersion 内核版本Uptime 系统正常运行时间并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。
另外,在/proc下还有三个很重要的目录:net,scsi和sys。
Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。
例如,如果系统不支持scsi,则scsi 目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。
系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID号为目录名,它们是读取进程信息的接口。
而self目录则是读取进程本身的信息接口,是一个link。
Proc文件系统的名字就是由之而起。
进程目录的结构如下:目录名称目录内容Cmdline 命令行参数Environ 环境变量值Fd 一个包含所有文件描述符的目录Mem 进程的内存被利用情况Stat 进程状态Status 进程当前状态,以可读的方式显示出来Cwd 当前工作目录的链接Exe 指向该进程的执行命令文件Maps 内存映象Statm 进程内存状态信息Root 链接此进程的root目录用户如果要查看系统信息,可以用cat命令。
Linux教程第12章 proc文件系统

第12章/proc文件系统实验目的●学习使用/proc文件系统●使用/proc文件系统显示缺页状态●使用/proc文件系统输出超过一个页面的信息。
请注意:你在第一阶段的学习中可以先把重点放在怎样使用proc文件系统上;关于proc 文件系统的内部实现细节,由于牵涉到太多文件系统原理与相关概念,建议你在学习完本书《文件系统》这一章之后,在回过头来对照相应代码进行分析。
实验内容1. 在/proc文件系统中添加必要的节点,以统计操作系统发生的缺页中断次数。
2. 实现一个proc文件接口,每次当用户读取这个proc文件的时候,要求打印出系统中所有进程的pid,comm,start_time,utime,stime,policy,priority 实验原理12.1 /proc文件系统procfs,是process fs的缩写。
最开始的时候只是一些进程相关的信息的集合,Linux 扩展了这个概念,可以通过/proc文件系统交互几乎任何内核的信息。
/proc不是一个真正的文件系统(这么说的意思是,/proc不像普通的文件系统是用于管理磁盘上的文件,并且要占用磁盘上的空间;/proc只存在于内存中,更确切地说是只有管理模块存在于内存中,所有具体的信息都动态地从运行中的内核里面读取)。
proc文件系统的历史有点复杂,基本上,随着Unix的演化而到了今天这个样子,为我们带来方便。
/proc文件系统是一个接口,用户与内核交互的接口,用户从/proc文件系统中读取很多内核释放出来的信息(包括内核各个管理模块的动态信息,CPU信息,硬件驱动释放出来的信息等等);同时内核也可以在必要的时候从用户得到输入,进而改变内核的变量,或者运行状态。
/proc文件系统中主要包含两方面的文件(或者说主要有两个大的用途):一是只读文。
proc文件系统介绍

proc⽂件系统介绍(1)linux内核是⼀个⾮常庞⼤、⾮常复杂的⼀个单独的程序,对于这样的⼀个程序来说调试是⾮常复杂的。
(2)项kernel这样庞⼤的项⽬,给⾥⾯添加/更改⼀个功能是⾮常⿇烦的,因为你这添加的⼀个功能可能会影响其他已经有的。
(3)早期内核版本中尽管调试很⿇烦,但是⾼⼿们还可以凭借个⼈超凡脱俗的能⼒去驾驭。
但是到了2.4左右的版本的时候,这个难度已经⾮常⼤了。
(4)为了降低内核调试和学习的难度,内核开发者们在内核中添加了⼀些属性专门⽤于调试内核,proc⽂件系统就是⼀个尝试。
(5)proc⽂件系统的思路是:在内核中构建⼀个虚拟⽂件系统/proc,内核运⾏时将内核中⼀些关键的数据结构以⽂件的⽅式呈现在/proc⽬录中的⼀些特定⽂件中,这样相当于将不可见的内核中的数据结构以可视化的⽅式呈现给内核的开发者。
(6)proc⽂件系统给了开发者⼀种调试内核的⽅法:我们通过实时的观察/proc/xxx⽂件,来观看内核中特定数据结构的值。
在我们添加⼀个新功能的前后来对⽐,就可以知道这个新功能产⽣的影响对还是不对。
(7)proc⽬录下的⽂件⼤⼩都是0,因为这些⽂件本⾝并不存在于硬盘中,他也不是⼀个真实⽂件,他只是⼀个接⼝,当我们去读取这个⽂件时,其实内核并不是去硬盘上找这个⽂件,⽽是映射为内核内部⼀个数据结构被读取并且格式化成字符串返回给我们。
所以尽管我们看到的还是⼀个⽂件内容字符串,和普通⽂件⼀样的;但是实际上我们知道这个内容是实时的从内核中数据结构来的,⽽不是硬盘中来的。
1、常⽤proc中的⽂件介绍(1)/proc/cmdline(2)/proc/cpuinfo(3)/proc/devices(4)/proc/interrupts2、proc⽂件系统的使⽤cat以⼿⼯查看程序中可以⽂件IO访问在shell程序中⽤cat命令结合正则表达式来获取并处理内核信息#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(int argc ,char **argv){int fd=-1;char buf[500]={0};if(argc!=2){printf("eg: %s -d|-v\n",argv[0]);return -1;}if(!strcmp(argv[1],"-v")){fd=open("/proc/version",O_RDONLY);read(fd,buf,sizeof(buf));printf("结果:\n%s\n",buf);}else if(!strcmp(argv[1],"-d")){fd=open("/proc/devices",O_RDONLY);read(fd,buf,sizeof(buf));printf("结果:\n%s\n",buf);}}3、扩展:sys⽂件系统(1)sys⽂件系统本质上和proc⽂件系统是⼀样的,都是虚拟⽂件系统,都在根⽬录下有个⽬录(⼀个是/proc⽬录,另⼀个是/sys⽬录),因此都不是硬盘中的⽂件,都是内核中的数据结构的可视化接⼝。
proc 文件系统

该函数将创建一个目录,父目录为parent。
proc文件系统的编程接口
删除节点(文件或者目录)remove_proc_entry()
void remove_proc_entry ( const char *name, struct proc_dir_entry *parent)
该函数将删除一个proc节点(按文件名删除)。
proc文件系统的编程接口
以上五个创建节点的函数在内核中的实现流程:
通过proc_create为结构申请空间,并进行一些初始化工 作。 proc_register则进一步填写结构中的域。并完成注册工作
删除节点的函数在内核中的实现流程:
则是先调用clear_bit和proc_kill_inodes,注销inode结构 ,如果引用数为0,则调用free_proc_entry释放结构对应 的空间;否则置一个删除标志,不释放空间
proc文件系统的编程接口
创建设备文件proc_mknod()
struct proc_dir_entry *proc_mknod( const char *name, mode_t mode, struct proc_dir_entry *paren建一个名字为name的设 备文件,文件类型和权限为mode,设备号为rdev 。
操作系统 课程设计
proc 文件系统
proc
proc 文件系统是 Linux 中的特殊文件系统,提供 中的特殊文件系统, 给用户一个可以了解内核内部工作过程的可读窗 口,在运行时访问内核内部数据结构、改变内核 在运行时访问内核内部数据结构、 设置的机制。 设置的机制。
保存系统当前工作的特殊数据,但并不存在于任何物 理设备中; 对其进行读写时,才根据系统中的相关信息即时生成 ;或映射到系统中的变量或数据结构; proc 被称为‘伪文件系统’; 其挂接目录点固定为/proc; ‘man proc’ 进行了详细说明。
第4章文件系统实验

1.用于接收数据的地址(指针)(buffer)
2.单个元素的大小(size):单位是字节而不是位,例如读取一个int型数据就是4个字节
3.元素个数(count)
4.提供数据的文件指针(stream)
返回值:读取的元素的个数
(3)
通过strstr()函数将找出cpu MHz在buffer出现的位置,为之后的提取值做准备
1.切换用户
2.建立文件,并查看文件
3.创建软连接ຫໍສະໝຸດ 4.查看创建结果5.查看结果
6.修改test
7.查看结果
分析结果
(1)创建链接后,读取test1的时候,由于链接的原因,实际上读取到的是test的内容,所以读取test.txt和test01时显示的内容是一样的。修改test之后,test01也会跟着改变,显示了同步性。
format格式控制字符串
argument选择性设定字符串
sscanf会从buffer里读进数据,依照argument的设定将数据写回。
三、实现文件的拷贝,即把一个文件内容复制到另一个文件
1.创建文件
2.编译代码
3.运行
4.创建t1,t2
5.运行copy代码
6.查看结果
7.删除t1
8.查看t2
结果分析:
strstr()
包含文件:string.h
函数原型:extern char *strstr(char *str1, char *str2);
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
返回值:返回该位置的指针,如找不到,返回空指针。
(4)
通过sscanf语句提取cpu的时钟频率
操作系统课程实验报告
proc文件系统 国防科大操作系统课件

我要加可个载以叫模加he载块llo,的不pr过oc要文给件我,创到建时一候
程序p工roc作_如t流e果s读t程写这(1个)文件,你就找 hello_read和hello_write
用户要 加载你 们这个 模块了
内核
hello_ hello_
init_module read write
好吧, 我同意 创建文 件。
我要写文件
程序h工ell作o 流程 (2)
用户要写文
件了,要写
的内容是 12345。怎 么办?
内核
知道了,我已 经记下来了。
hello_write
12345
程序我 h工e要ll作o读流文件这 出 h程el个 的lo(文 内m3e件 容)ss可是ag以:e:读。读
More write: 12345
创建proc文件
• 在上面的例子中,我们看到,通过编写一段 程序,在/proc目录下创建了如下内容:
一个名叫proc_test的子目录。 一个名叫current的文件,只读,读出的内容是
读它的进程的情况。
一个名叫current_too的链接,指向current。 一个名叫hello的文件,可读可写。读出的内容是
proc文件和用户的交互
• 当用户(用户态程序)写proc文件时,内核调 用预先设定的写函数。(回调)
• 写函数的例子,请看例子程序里面的 proc_write_hello函数。
• 参数2,3对我们有用,分别表示要写什么东西 进去,要写多少字节。
• 注意要用copy_from_user函数。 • global_buffer是我们用来保存数据的缓冲区。
gcc -c -I/usr/src/linux-2.4.208/include proc_test.c
实验指导书--实验11 Linux proc文件系统

实验十一:Linux proc文件系统实验学时:4实验类型:验证实验要求:选修一、实验目的通过本实验的学习,理解和分析proc文件系统,掌握Linux proc文件的特点和使用方法,访问有关内核的状态、计算机的属性、正在运行的进程状态等信息。
二、实验内容实验内容:了解proc文件系统,编写一个c程序,获取系统相关信息,实时监测(周期性显示)CPU、主存和网络的详细使用情况以及它们的利用率。
三、实验原理、方法和手段实验原理:proc 文件系统介绍:proc 文件系统是一个虚拟文件系统,是一种内核和内核模块用来向进程(process) 发送信息的机制 (所以叫做proc)。
这个虚拟文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。
与其他文件系统不同,proc 存在于内存之中而不是硬盘上。
proc文件系统包含一些目录和虚拟文件。
大部分proc中的文件和目录提供系统物理环境最新的信息。
/proc目录中有一些以数字命名的目录,它们是进程目录。
系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。
此外,在Linux2.6.0-test6以上的版本中/proc/pid 目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。
/proc 由内核控制,没有承载 /proc 的设备。
因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。
对/proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。
这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四 PROC文件系统
预备知识
proc文件系统功能 proc文件描述
proc进程目录结构
实验指导
proc信息获取
终端图形编程curses
图形界面编程GTK和Qt
实验目的、内容
2.1 proc信息获取—获取性能参数
读取proc文件系统,能获取系统各种性能参数
CPU使用率:/proc/stat 来源数据:用户模式(user)、低优先级用户模式(nice)、内核模式 (system)和空闲的处理器时间(idle) 计算方法:100 * (user+nice+system) / (user+nice+system+idle) 内存使用情况:/proc/meminfo 来源数据:当前内存使用量(cmem)、内存总量(amem) 计算方法:100 * (cmem / amem) 网络负载情况:/proc/net/dev 来源数据:从本机输出的数据包数(output)、流入本机的数据包数 (input) 计算方法:(output+input) / 2
2.2 终端图形编程curses—在屏幕上显 示字符
echochar(char) / addch(ch) 显示某个字符 mvaddch(y,x,ch) 在(x,y)上显示某个字符 addstr(str) 显示一串字符 mvaddstr(y,x,str) 在(x,y)上显示一串字符 printw(format,str) 以一定的格式输出至屏幕 mvprintw(y,x,format,str) 在(x,y)位置做printw的工作 getch()、getstr() 从键盘上读取字符/字符串 scanw(format,&arg1,&arg2) 同scanf()读取字符或字符串 ……
2.2 终端图形编程curses—常用的特殊 键
特殊控制字符以KEY_开头定义在curses.h头文件中 使用时必须将keypad设定为TRUE KEY_UP 0403 ↑ KEY_DOWN 0402 ↓ KEY_LEFT 0404 ← KEY_RIGHT 0405 → KEY_HOME 0406 Home key (upward+left arrow) KEY_BACKSPACE 0407 backspace (unreliable) KEY_F0 0410 Function keys. KEY_F(n) (KEY_F0+(n)) formula for f . KEY_NPAGE 0522 Next page KEY_PPAGE 0523 Previous page
2.1 proc信息获取—调整内核配置
修改内核参数、改变内核状态涉及到的主要文件
/proc/sys
/proc/sys/kernel
/proc/sys/net
存放所有可读写的文件的目录,的网络属性
示例:
允许ip转发:/proc/sys/net/ipv4/ip_forward 禁止ping:/proc/sys/net/ipv4/icmp_echo_ignore_all
区分标准屏幕(stdscr)和当前屏幕(curscr)
标准屏幕(stdscr)代表终端的整个屏幕区域 当前屏幕(curscr)是能够看到的屏幕
2.2 终端图形编程curses—设置函数的 描述
initscr() endwin() cbreak()
开启curses模式 关闭curses模式 该模式下除特殊控制字符外的一切输入 字符立刻被读取 nobreak() 该模式下键盘输入的字符被存在buffer中 直到输入RETURN或NEWLINE echo() / noecho() 输入字符是/否显示在终端上 refresh() 刷新屏幕,一次完成之前所做的变动, 其余信息不变。第一次调用将清除屏幕 move(y,x) 将鼠标移动至x,y位置 getyx(win,y,x) 得到当前鼠标位置 clear() / erase() 将整个屏幕清除,须与refresh()配合使用 ……
2.3 图形界面编程Qt
跨平台的C++图形用户界面应用程序框架 Qt的开源版本不允许用来开发商业软件,否则要付费 基于成熟的C++语言,用面向对象的思想组织 “一次编写、到处编译”:编译出来的程序可运行于Win32、 Linux、Solaris及Mac OS X中,甚至嵌入式系统 组成部分:Qt、基于Framebuffer的Qt Embedded、快速开发 工具Qt Designer、国际化工具Qt Linguist等
包含的内容
系统/内核信息 运行中的进程信息 通过/proc与内核交互(慎重使用)
1.2 proc文件描述
文件提供的系统信息不针对某个特定进程 文件随系统配置的不同而不同 命令procinfo显示基于其中某些文件的多种系统信息 /proc下主要的文件
/proc/cmdline: 内核启动的命令行 /proc/cpuinfo: CPU信息 /proc/devices: 字符和块设备的主设备号及设备名称 /proc/meminfo: 内存状态信息 /proc/modules:可加载内核模块的信息 /proc/mounts:当前系统所安装的文件系统信息 /proc/stat: 所有CPU活动的信息 ……
Glib:底层库,封装基本的数据结构操作、底层功能接口及平台相关
代码 GDK:封装底层访问窗口系统的函数 gdk-pixbuf:客户端的图像处理库 Pango:文本布局和渲染库,是GTK+2.0文本和字体处理的核心 Cairo:2D图形库,支持多种输出设备,支持硬件加速 ATK:一组提供访问性的接口
实验四 PROC文件系统
实验四 PROC文件系统
预备知识
proc文件系统功能 proc文件描述
proc进程目录结构
实验指导
proc信息获取
终端图形编程curses
图形界面编程GTK和Qt
实验目的、内容
1.1 proc文件系统功能
常驻虚拟内存,维持操作系统动态数据的伪文件系统 可以在Linux内核空间和用户空间之间进行通信 进程可用文件系统的方式、通过对虚拟文件的读写实 现与内核内部数据结构的交互
——直接向文件中写入“1”实现相关配置,写入“0”取消 相关配置
2.2 终端图形编程curses—函数库
几乎所有UNIX、Linux操作系统都带curses函数库 curses库提供基本的屏幕操作函数,包括输入/输出、 屏幕初始化、屏幕处理中断及窗口创建等操作 使用方法:
包含头文件curses.h 编译和链接:gcc [flag] file –lcurses
实验四 PROC文件系统
预备知识
proc文件系统功能 proc文件描述
proc进程目录结构
实验指导
proc信息获取
终端图形编程curses
图形界面编程GTK和Qt
实验目的、内容
3.1 实验目的
理解和分析proc文件系统,掌握proc文件的特点和 使用方法 掌握Linux下终端图形编程方法,能编写基于文本的 图形界面 掌握Linux下图形界面编程工具,能用GTK或QT进 行图形界面的开发
2.2 终端图形编程curses—特殊属性
通过变化让输出屏幕画面更为生动: attron(mod) 开启属性 attroff(mod) 关闭属性 A_UNDERLINE 加底线 A_REVERSE 反白 A_BLINK 闪烁 A_BOLD 高亮度 A_NORMAL 标准模式(只能配合 attrset() 使用) ……
1.3 proc进程目录结构
每个进程对应一个用它的PID命名的子目录,是 读取进程信息的接口 包含可以提供有关进程的状态和环境的重要信息 信息的文件
/proc/pid/cmdline:启动进程时调用的命令行 /proc/pid/environ:为该进程定义的所有环境变量 /proc/pid/fd:进程当前打开的所有文件描述符 /proc/pid/mem:进程在内存中的内容 /proc/pid/status:进程当前的状态信息 /proc/pid/exe:指向进程执行的可执行程序的符号链接 /proc/pid/maps:进程的内存映像 ……
3.2 实验内容
实时监测
编写一个C程序,使用Linux下基于文本的终端图形编程库 curses,分窗口实时监测(即周期性刷新显示)CPU、内存和网 络的详细使用情况和它们的利用率
从proc文件系统获取信息
通过读取proc文件系统,获取系统各种信息(如主机名、系统 启动时间、版本号、所有进程信息、CPU使用率、内存使用 率等),并以比较容易理解的方式显示出来。要求:参照 Windows的任务管理器,利用GTK或Qt实现图形界面编程
当使用attron()开启另一种属性时,必须利用attroff()先关闭原 来的属性,或直接以attrset(A_NORMAL)将所有特殊属性关 闭。否则,curses会将两种属性做重叠处理。
2.3 图形界面编程GTK
用于创建图形用户界面的工具包
遵循LGPL许可证,可用来开发开源软件、自由软件或商业 软件,而不需任何花费购买许可证或使用权 面向对象的应用程序接口,完全用C编写,但基于类和回调 函数的思想实现 组成部分