shell学习五十八天----/proc文件系统

/proc文件系统

前言:linux中的/proc文件系统,由一组目录和文件组成,挂载(mount)与/proc目录下.

/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口.这为查看和改变各种系统属性开启了方便之门.此外,还能通过一组以/proc/PID形式命名的目录(PID是进程的ID)查看系统汇总运行各进程的相关信息.

通常,/proc目录下的文件内容都采取可读的文本形式,shell脚本也能对其进行解析.程序可以打开,读取和写入/proc目录下的既定文件.大多数情况下,只有特权进程才能修改/proc目录下的文件内容.

一.proc文件系统初步

1. /proc文件系统

/proc文件系统是一种特殊的,由软件创建的文件系统,内核使用它向外界到处信息. /proc下面的每个文件都绑定一个内核文件,用户读取其中的文件时,该函数动态的生成文件的”内容”.

由于/proc文件系统已经被添加了大量的信息.因此,最好的办法是使用sysfs而不是/proc文件系统想歪导出信息.

/proc文件不仅可以用于读数据,也可以用于写数据,不过写数据比较麻烦一些,这里只描述数据的用法.写数据的方法可以在看完读数据的过程后参考kernel源码

2.创建/proc文件的函数

前面说了/proc下的文件都是在访问实时生成文件内容的,那么为了创建/proc下的一个只读的文件,我们必须实现一个函数用于在读取文件时生成数据,万幸,该函数接口设计好了,我们只要按照函数接口实现自己需要的功能就可以了.函数原型如下:

int (*read_proc)(char *page,char **start,off_t offset,int count,int *eof,void *data);

参数说明:


参数名


说明


page


用来写入数据的缓冲区;也就是说从/proc文件中独到的数据都写入到page指向的缓冲区中


start


用于指定事迹的数据写入到page指向的内存也的具体的那个位置


offset


和read函数中的参数意义相同


count


和read函数中的参数意义相同


eof


当没有数据返回时,必须设置该参数为一个整数,例如:*eof=1;


data


该参数是内核提供给驱动程序的专用指针,可以用于内部记录

*创建制度的/proc文件的函数

struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data)

参数说明:


参数名


说明


name


要创建/proc下的文件名


mode


创建的文件权限的掩码,若为0,则使用系统默认的权限


base


该文件所在的父目录,若该参数为null,则该文件将会被创建在/proc的根目录下


read_proc


读取/proc下的文件时调用的函数,也就是前面讲解的那个函数


data


内核会忽略date,但会把该参数传递给read_proc函数

删除/proc系统文件的函数:

void remove_proc_entry(const char *name, struct proc_dir_entry *parent)

参数说明:


参数名


说明


name


在/proc文件系统中创建的文件名


parent


父目录名

3.使用/proc文件系统的缺点

(1).删除调用可能在/proc文件系统的文件正在被使用时发生

(2)同一个文件名可能注册两次,这将会发生错误

二.创建简单的/proc文件

#cd /proc ; vi read_proc  //read_proc的内容如下:

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/module.h>

#include <linux/proc_fs.h>

int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data);

static int __init test_proc_init(void)

{

create_proc_read_entry("read_proc",0,NULL,read_proc,NULL);

return 0;

}

static void __exit test_proc_exit(void)

{

remove_proc_entry("read_proc",NULL);

}

int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data)

{

int len = sprintf(page,"%s\n","hello world");

return len;

}

module_init(test_proc_init);

module_exit(test_proc_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("wangxq");

#cat /proc/read_proc

hello world

/proc目录的应用

对此文件系统的访问同一般文件相同。

例:

1.统计cpu个数:

cat /proc/cpuinfo | grep‘physical id‘|uniq -c|wc –l

2.cpu型号

cat /proc/cpuinfo|grepname|cut -f2 -d:|uniq

3.计算每个cpu的内核数

cat /proc/cpuinfo | grep‘physical id‘|awk -F‘:‘ ‘{count[$2]++;}END{sum=0;for(a in count){cc++;sum+=count[a]}printsum/cc;}‘

4.内核版本

cat /proc/version|cut-f1 -d‘(‘

5.内核执行的上下文转换次数

cat /proc/stat|grep ctxt|awk‘{print $2}‘

6.系统创建的进程数

cat /proc/stat|grep processes|awk‘{print $2}‘

7.当前可用的内存数量

cat /proc/meminfo|grep MemFree

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 11:18:20

shell学习五十八天----/proc文件系统的相关文章

shell学习四十八天----进程建立

进程 前言:进程指的是执行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后执行,知道他们下达exit()系统调用为止. linux系统都支持多进程.虽然计算机看起来像是一次做了很多事,但除非是他拥有多个CPU,否则一次做了好多事只是个错觉.事实上,每个进程仅容许在一个极短的期间执行,我们称为时间片段,之后进程会先暂时搁置,让其他等待中进程执行.时间片段极短,通常只有几微妙,所以人们很少感觉到进程将控制权交回内核,再交给另一个进程的这种文本切换.进程本身不会管理文本切

shell学习五十天----查看进程ps命令

进程列表 列出进程中最重要的命令便是进程状态命令:ps. ps命令是进程状态(Process Status)的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令. 要对进程进行检测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态,进程是否结束,进程有没有僵尸,哪些进

shell学习五十六天----延迟进程调度

延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在交谈模式中使用下,有时不必等到命令完毕才干运行还有一个.这是shell提供的一个简单方式:全部的命令仅仅要在最后加上&字符,都可起始于后台运行,无需等待.仅仅有在少数情况下,必须等待后台进程完毕. 稍稍有四种情况须要延时进程事实上,知道未来的某个事件才运行. 第一种 sleep sleep命令经常使

shell学习三十八天----执行顺序和eval

执行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包含了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 事实上嗨哟很多特殊符号可用来分割单个的命令:分号(;),管道(|),&,逻辑AND(&&),逻辑OR(||).对于每一个地区的管道,shell都会将命令分割,为管道设置I/O,并且对每一个命令依次执行下面的操作. 看起来很复杂,但是每一个步骤都是在shell的内存里发生的,shell不会真的把每个步骤的发生演示给我们看.所以这是我们分析shell内

shell学习五十二天----删除进程kill命令

进程的控制与删除 使用kill命令可以终止进程.通常,终止一个前台进程可以使用ctrl+C键,但是对于一个后台进程就必须使用kill命令来终止,我们需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉进程.kill命令是通过向进程发送指定的信号来结束相应进程的.在默认情况下,采用编号为15的TREM信号.TERM信号将终止所有不能获取该信号的进程.对于那些可以获取该信号的进程就要用编号为9的kill信号,强行"杀掉"该进程. kill命令详解

shell学习五十四天----进程系统调用的追踪strace

strace 前言:strace常用来跟踪进程执行时的系统调用的所接受的信号.在linux世界,进程是不能直接访问硬件设备,当进程需要访问硬件(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备.strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间,有其在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统是如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执

shell学习五十一天----top命令查看进程列表

top命令查看进程列表 top命令是linux下常用的性能分析工具,能实时显示系统中各个进程的资源占用状况.和win的资源管理器类似.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态,如果在前台执行该命令,它将独占前台,知道用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最"敏感"的任务列表.该命令可以按CPU使用,内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互命令或者在个人定制文件中进行设定. t

shell学习四十六天----文件系统的空间信息df和du命令

文件系统的空间信息 df命令 df命令提供单行摘要,一行显示一个加载的问价系统的已使用的和可用的空间.其单位视系统而定,有些使用块,有些则是KB.大部分现代实现都支持-k选项,也就是强制使用KB单位,以及-l(小写字母L)选项,仅显示本地文件系统,排除网络加载的文件系统. df命令详解 语法: df [选项] [文件或目录] 用途: 显示一个或多个文件系统内部的inode或空间使用情况 主要选项: -i 显示inode技术,而非空间 -k 显示空间时,以KB为单位,而非块 -l 小写L,仅显示本

shell学习四十八天----文件校验和匹配

文件校验和匹配 要是你怀疑可能有非常多文件具有同样的内文,而是用cmp或diff进行比較全部横队的比較,导致所花费的时间会随着文件数目增长成次方的增长. 这是能够使用file checksum(文件校验和),取得近似线性的性能.有非常多工具可用来计算文件与字符串的校验和,包含sum,cksum,以及checksum,消息摘要工具md5与md5sum,安全性散列算法工具sha,shalsum,sha256,以及sha384. 案例: $echo -n "hello" | md5sum |