linux下proc文件接口详解

DS小龙哥 DS小龙哥     2022-12-02     618

关键词:


Linux下proc文件接口​

proc目录介绍

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/N中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程。

大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。


二、proc常见的一些文件功能介绍

2.1/proc/apm

高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;


2.2/proc/buddyinfo

用于诊断内存碎片问题的相关信息文件;


2.3/proc/cmdline

在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;


2.4/proc/cpuinfo

处理器的相关信息的文件;


2.5/proc/crypto

系统上已安装的内核使用的密码算法及每个算法的详细信息列表;


2.6/proc/devices

系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;


2.7/proc/diskstats

每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)


2.8/proc/dma

每个正在使用且注册的ISA DMA通道的信息列表;


2.9/proc/execdomains

内核当前支持的执行域(每种操作系统独特“个性”)信息列表;


2.10/proc/fb

帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;


2.11/proc/filesystems

当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;


2.12/proc/interrupts

X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;


2.13/proc/iomem

每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;


2.14/proc/ioports

当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;


2.15/proc/kallsyms

模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大;


2.16/proc/kcore

系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件;


2.17/proc/kmsg

此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件;


2.18/proc/loadavg

保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;


2.19/proc/locks

保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;


2.20/proc/mdstat

保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态:


2.21/proc/meminfo

系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;


2.22/proc/mounts

在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;


2.23/proc/modules

当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;


2.24/proc/partitions

块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);


2.25/proc/pci

内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替;


2.26/proc/slabinfo

在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页;


2.27/proc/stat

实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,

“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);

“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒;

processes (total_forks)自系统启动以来所创建的任务的个数目;

“procs_running”:当前运行队列的任务的数目;

“procs_blocked”:当前被阻塞的任务的数目;


2.28/proc/swaps

当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;


2.29/proc/uptime

系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;


2.30/proc/version

当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示;


2.31/proc/vmstat

当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)


2.32/proc/zoneinfo

内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:


三、相关接口函数

Proc文件接口,主要用于驱动代码调试,可以直接使用cat命令访问proc目录下的对应文件接口即可。

需要使用的头文件:

#include <linux/proc_fs.h>

#include <linux/fs.h>

  1. 在proc目录下创建子目录函数

static inline struct proc_dir_entry *proc_mkdir(const char *name,struct proc_dir_entry *parent)

示例: //注意只能创建单层目录

//在proc目录下创建aaa文件夹

proc_mkdir("aaa",NULL);

  1. 在proc目录下创建文件

static inline struct proc_dir_entry *proc_create(const char *name, //文件名称

umode_t mode, //模式,默认为0

struct proc_dir_entry *parent, //父目录结构

const struct file_operations *proc_fops) //文件集合

示例:

//在proc目录下创建一个文件

proc_create("aaa/tiny4412_proc_test", 0, NULL, &fops_proc);

  1. 删除proc目录下之前创建的文件或者目录

void remove_proc_entry(const char *name, //文件的路径

struct proc_dir_entry *parent //父目录结构

)

示例:

remove_proc_entry("aaa/tiny4412_proc_test", NULL);

注意: 如果是删除目录,需要先把目录下的文件删除掉,每次删除必须保证目录是空的。


四、示例代码

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/miscdevice.h>

#include <linux/fs.h>

#include <asm/uaccess.h>

#include <asm/io.h>

#include <linux/delay.h>

#include <linux/gpio.h>

#include <mach/gpio.h>

#include <plat/gpio-cfg.h>

#include <linux/proc_fs.h>


static int tiny4412_open(struct inode *inode, struct file *file)

printk("tiny4412_open ok\\n");

return 0;


static ssize_t tiny4412_read(struct file *file, char __user *buf, size_t cnt, loff_t *loff)

copy_to_user(buf,"123456",6);

printk("tiny4412_read调用成功.\\n");

return 0;

linux目录--proc详解

...unsbinsrvsystmpusrvarproc简介Linux内核提供了一种进程信息虚拟文件系统(Processinformationvirtualfilesystem),简称proc,通过proc这个虚拟的文件系统,可以在运行时访问内核(core)内部数据结构、 查看详情

notes16proc文件系统,内存分配,数据类型(代码片段)

文章目录1.创建proc文件系统接口:之前调试内核时都是通过prink打印内核信息,通过dmesg查看输出的信息。新调试方法:利用proc文件系统在pro文件夹下创建接口,读写这个接口就可实现对内核的调试2.内核内存分配... 查看详情

linux驱动开发-proc接口介绍(代码片段)

1.前言Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过... 查看详情

深入理解linux系统下proc文件系统内容

http://www.itshanghai.net/technology/2009/0209/article_238.html 另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统。Linux系统上的/proc目录 查看详情

linux系统的/proc目录

1./proc目录Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作... 查看详情

在没有 /proc/self/exe 的情况下查找当前可执行文件的路径

】在没有/proc/self/exe的情况下查找当前可执行文件的路径【英文标题】:Findingcurrentexecutable\'spathwithout/proc/self/exe【发布时间】:2010-11-0415:07:48【问题描述】:在我看来,Linux使用/proc/self/exe很容易。但我想知道是否有一种方便的... 查看详情

linux命令lsscsi详解(代码片段)

...令格式3.结果含义四、命令举例五、其他1.Linux下scsi相关文件节点2.Linux开启SCSI日志调试功能想要弄明白lsscsi命令,首先我们必须搞清楚什么是SCSI,以及常见的硬盘接口 查看详情

linux命令lsscsi详解(代码片段)

...令格式3.结果含义四、命令举例五、其他1.Linux下scsi相关文件节点2.Linux开启SCSI日志调试功能想要弄明白lsscsi命令,首先我们必须搞清楚什么是SCSI,以及常见的硬盘接口 查看详情

linux下进程信息/proc/pid/status文件深入分析(代码片段)

Name:Log2HostflushUmask:0022State:D(disksleep)-----------------------表示此时线程处于sleeping,并且是uninterruptible状态的wait。Tgid:157-----------------------------------线程组的主pid为157。Ngid:0Pid:159------------------- 查看详情

手机中proc文件夹的作用,能删吗

手机内存中有一个proc得文件夹,有近1G大,这个文件夹走什么作用,能删除吗参考技术Aproc目录Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它... 查看详情

linux命令lsscsi详解(代码片段)

...令格式3.结果含义四、命令举例五、其他1.Linux下scsi相关文件节点2.Linux开启SCSI日志调试功能想要弄明白lsscsi命令,首先我们必须搞清楚什么是SCSI,以及常见的硬盘接 查看详情

linux内核模块编程-proc文件系统

什么是procproc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数... 查看详情

linux根目录详解

/   根目录:根目录,文件的最顶端,整个文件系统的根目录/bin   用户二进制文件:存放系统所需的重要命令/sbin  系统二进制文件:存放一些系统管理的命令,一般只能由超级权限用户root执行/etc&nb... 查看详情

linux目录结构与功能详解

...用的命令。2/boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。3/devdev是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。4/etc这个目录... 查看详情

linux下路由设置详解

...机直接连接到的网络,网关通常是本地计算机对应的网络接口,但是此时接口必须和网关一致;如果是远程网络或默认路 查看详情

linux系统中的lsof详解

lsof简介lsof(listopenfiles)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议(TCP)和用户数据报协议(UDP)套接... 查看详情

linux根目录下主要目录详解

1:/bin是一个可执行二进制文件的目录,比如我们经常用到的一些命令ls,tar,mv,cat等。2:/boot它主要放置linux系统启动时用到的一些文件。/boot为linux的内核文件。3:/dev是存放linux系统下的设备文件,当我们访问该目录下面的某个... 查看详情

sysctl

...级选项,修改内核参数永久生效。也就是说/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。设置或重新设置联网功能:如IP转发、IP碎片去除以及源 查看详情