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
shell学习五十八天----/proc文件系统的更多相关文章
- shell学习五十六天----延迟进程调度
延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...
- shell学习五十天----查看进程ps命令
进程列表 列出进程中最重要的命令便是进程状态命令:ps. ps命令是进程状态(Process Status)的缩写.ps命令用来列出系统中当前执行的那些进程.ps命令列出的是当前那些进程的快照,就是执 ...
- linux shell学习五
参考:https://www.linuxdaxue.com/ Shell函数 因为函数是脚本类语言,在执行时是逐行执行的,因此,Shell 函数必须先定义后使用. Shell 函数的定义格式如下: [ ...
- shell学习三十八天----运行顺序和eval
运行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包括了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 其实嗨哟非常多特殊符号可用来切割单个的命令:分号(;),管道(| ...
- shell学习四十八天----文件校验和匹配
文件校验和匹配 要是你怀疑可能有非常多文件具有同样的内文,而是用cmp或diff进行比較全部横队的比較,导致所花费的时间会随着文件数目增长成次方的增长. 这是能够使用file checksum(文件校 ...
- shell学习五十七天----linux任务管理,针对上一讲的总结和扩展
linux任务管理 在linux下有两类任务管理,各自是一次性和周期性.一次性是at和batch,周期性又分为系统不论什么和用户任务. 一次性任务: 1.命令格式:at [选项] time 2.选项: ...
- proc 文件系统学习
proc.txt翻译 ------------------------------------------------------------------------------Version 1.3 ...
- Shell学习之结合正则表达式与通配符的使用(五)
Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符 ...
- 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解
http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...
随机推荐
- nobr 不换行标签
示例代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- "0" 并不一定是 假 (false)
写习惯C/C++系代码的人应该很习惯看见类似这样的代码: 1 2 3 4 5 int i = 0; ...... if(i){ //这里代码不会被执行 } 因此写习惯以后会想当然地觉得其他语言里 ...
- Android画图系列(二)——自己定义View绘制基本图形
这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们 ...
- Scala实现冒泡排序、归并排序和快速排序
1.冒泡排序 def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tai ...
- 小心!Ubuntu14.04 升级到16.04 的几个坑
收录待用,修改转载已取得腾讯云授权 昨天趁着周末把服务器升级了一把,遇到的坑可不少: sudo apt update sudo apt dist-upgrade 坑1:升级失败后,改用下面命令: su ...
- HTML5 Canvas 绘制库存变化折线 画入库出库柱状图
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- 简单模拟Spring的注入
主要就是读XML技术和反射技术. 在xml中读出相关配置信息,然后利用反射将其实例化为对象,并调用其构造方法,在实例化的过程中将属性注入实例. 实例化和属性注入这些操作都交给了框架,不再需要自己的去n ...
- IE 页面不正常显示 错误脚本不报错 脚本调试相关
在开发时,有时自己做的页面上的JS有错误,但是IE浏览器并不报错,这个时候有可能是因为脚本调试被禁止了. 在Internet选项的高级里面有 两个禁止脚本调试选项,把他们去掉就行.
- (五)EasyUI使用——datagrid数据表格
DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识.它是轻量级的且功能丰富.单元格合并. ...
- Azure Storage Blob Go SDK示例
简介 前面一篇博客介绍了关于Azure ManagerAPI Go SDK的使用,本篇继续介绍使用Blob Go SDK 操作中国区Azure Blob. SDK下载: go get github.c ...