/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

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

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

    延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...

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

    进程列表 列出进程中最重要的命令便是进程状态命令:ps. ps命令是进程状态(Process Status)的缩写.ps命令用来列出系统中当前执行的那些进程.ps命令列出的是当前那些进程的快照,就是执 ...

  3. linux shell学习五

    参考:https://www.linuxdaxue.com/ Shell函数 因为函数是脚本类语言,在执行时是逐行执行的,因此,Shell 函数必须先定义后使用. Shell 函数的定义格式如下: [ ...

  4. shell学习三十八天----运行顺序和eval

    运行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包括了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 其实嗨哟非常多特殊符号可用来切割单个的命令:分号(;),管道(| ...

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

    文件校验和匹配 要是你怀疑可能有非常多文件具有同样的内文,而是用cmp或diff进行比較全部横队的比較,导致所花费的时间会随着文件数目增长成次方的增长. 这是能够使用file checksum(文件校 ...

  6. shell学习五十七天----linux任务管理,针对上一讲的总结和扩展

    linux任务管理 在linux下有两类任务管理,各自是一次性和周期性.一次性是at和batch,周期性又分为系统不论什么和用户任务. 一次性任务: 1.命令格式:at [选项] time 2.选项: ...

  7. proc 文件系统学习

    proc.txt翻译 ------------------------------------------------------------------------------Version 1.3 ...

  8. Shell学习之结合正则表达式与通配符的使用(五)

    Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符 ...

  9. 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解

    http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...

随机推荐

  1. iOS 常用的#define合集

    1.定义常量 定义常量的时候最好以小写字母k开头,让人见名知意, (1)导航栏高度:我们都知道iPhone竖屏时候导航栏的高度为44,这时候可以定义一个常量来表示该高度, #define kNaivg ...

  2. [Java基础] java多线程关于消费者和生产者

    多线程: 生产与消费 1.生产者Producer生产produce产品,并将产品放到库存inventory里:同时消费者Consumer从库存inventory里消费consume产品. 2.库存in ...

  3. RUEI 13.1.1版本在OEL 5.7上的安装

    准备工作 ntp的工作和同步 /sbin/chkconfig --list | grep ntpd ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off /sb ...

  4. 用ghost备份和还原Linux系统

    备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程.传统的数据备份主要是采用内置或外置的磁带机进行冷备份.但是这 ...

  5. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何获取标准驱动器扭矩值获取电流值

    双击某个驱动器(以松下伺服驱动器为例),在Process Data中,注意默认显示了PDO mapping1的数据(Error code, status word等)   注意左侧,2和3分别表示了与 ...

  6. Selenium webdirver Java 操作浏览器

    打开浏览器 HtmlUnit Driver 优点:不会实际打开浏览器,运行速度很快. 缺点:对JavaScript的支持不够好,有时会捕获不到页面元素. 使用:WebDriver driver=new ...

  7. Jmeter变量参数化及函数应用

    分类: 测试工具 2006-12-14 10:54 12041人阅读 评论(5) 收藏 举报 javascriptloadrunnerrandom脚本测试多线程 我们在使用Jmeter录制脚本后,经常 ...

  8. UVA 6475 Effective Infection Time

    You are estimating the threat level of quarantined zones that have been abandoned to the infection. ...

  9. 向 mysql 插入汉字时报错 Incorrect string value: '\xE6\x9B\xB9\xE5\x86\xAC...' for col....

    Incorrect string value: '\xE6\x9B\xB9\xE5\x86\xAC...' for column 'realname' at row 1 该情况一般是由数据库设计时的编 ...

  10. PHP-手册阅读

    配置选项: html_errors: 无意义的 HTML 标记符会使得出错信息很凌乱, 所以在外壳下阅读报错信息是十分困难的, 因此将该选项的默认值改为 FALSE implicit_flush: 在 ...