procfs是一个特殊的文件系统,和sysfs一样,它是一个只有在你看的时候才会存在的文件系统,它们一样都是用来进行内核-用户态通信的,它们和netlink或者syscall的区别在于它们是文件的方式,大量的文件系统接口都可以使用,免去了编写c代码或者其它代码的工作量,只需要cat,echo等简单命令就可以和内核交互。
若按照常规方式来理解procfs,那么其中的文件在存在之前必然需要先创建,事实上也真的是这样的,create_proc_entry和proc_mkdir都是做这事的,于是猜想那里面的以pid作为目录名的目录也是proc_mkdir之类建立的,然后狠在sys_fork的调用路径中找这类函数,结果枉然!Why?我们忽略了procfs文件系统的实质,对linux的vfs理解不够深刻!所谓的fs仅仅是一个接口,一个数据通信的接口,一个文件就是一个数据源,只要能从中读取数据即可,因此简单说一个实体只要对read起反应那它就是一个文件,vfs只是将这类实体做了一个集合。因此磁盘文件是文件,内存数据也是文件,磁盘作为不易失介质的作用是保存数据,而内存作为易失介质只要在其不复位的情况下能提供数据即可,所以没有必要必须先创建一个文件,只要内核中的数据结构保持完整,当有read请求到来的时候能把数据推出去即可。
因此,看一下proc_root这个proc_dir_entry就可以了,其中的proc_root_operations有readdir这个回调函数proc_root_readdir:
static int proc_root_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
...
if (nr < FIRST_PROCESS_ENTRY) {
int error = proc_readdir(filp, dirent, filldir);
...
filp->f_pos = FIRST_PROCESS_ENTRY;
}
...
ret = proc_pid_readdir(filp, dirent, filldir); //在这个函数中开始遍历当前所有的进程,也就是遍历TGID,一次遍历有限个数,并且取得相应的信息
return ret;
}
并不一定非要先创建所谓的文件才能读取文件的内容,重要的是任何数据结构只要关联一个file_operations并且关联一个挂载点,那么它就可以被作为文件来操作,也就是说,套在linux的vfs框架上的任何数据结构都可以作为文件,这个意义上,磁盘文件只是文件的一种特殊形式罢了。
上述的readdir也是一个回调函数,它读取了file结构体表示的目录(目录也是一个文件)下的所有文件,取得这些文件的信息后填入dirent,linux同时提供了readdir这个系统调用,这个系统调用实现的高效性在于文件系统的文件名和文件内容的分离,文件名仅仅体现在目录的属性或者元数据上,一般文件的元数据中不包含文件名,目录中的文件名指向该文件名对应的文件体,这样readdir只需访问目录的属性就可以取出该目录下的所有文件名称及其简单属性了,这种名称和内容分离的另一个好处是很方便实现符号链接,因为符号链接即是多个文件名对应一个文件,这样只需将不同目录中的多个文件名指向一个文件即可,而无需在文件的元数据中保存一个变长的文件名列表,另外,文件名和文件内容的分开存放对于减少磁盘碎片也是一个帮助,文件的改名或者改内容操作只会集中在某一个区域中。
分享到:
相关推荐
在Linux操作系统中,有一个非常重要的伪文件系统,名为`procfs`。这个特殊的文件系统为用户提供了一种简单而直接的方式来访问正在运行的内核的状态以及进程信息。它允许用户通过简单的文件读写操作来获取或设置系统...
procfs这个箱子是linux上proc伪文件系统的接口,通常以/ proc挂载。 从长远来看,此板条箱旨在相当准确。此板条箱是linux上proc伪文件系统的接口,通常以/ proc挂载。 从长远来看,此包装箱旨在使功能完全完善,但...
Linux procfs相关资料,里面有N个文档。 Linux procfs详解 .doc Linux_proc.pdf linux_proc_文件程序.doc linux_procfs详解.txt linux_proc文件系统.doc Linux中proc文件详解.pdf ...proc文件系统.pdf
`proc`并非一个真正的磁盘文件系统,而是一种特殊的虚拟文件系统,它存在于内存中,提供了一个访问内核数据结构的接口。通过`proc`,用户空间程序可以读取或修改内核运行时的状态,这为系统管理和故障诊断提供了强大...
- TMPFS:利用本地内存作为存储介质的文件系统,通常用于临时文件,例如在Solaris中,/tmp目录就是用TMPFS实现的。 - LOFS(Loopback File System):创建一个虚拟的原文件系统,通过不同的路径访问同一文件,常...
在Java编程中,获取当前系统所有进程主要是通过与操作系统交互来实现的。有两种主要的方法:一种是通过系统宿主命令,另一种是使用JNI(Java Native Interface)。 1. 通过系统宿主命令获取: 这种方法适用于跨...
5.1. /proc文件系统 6. 使用 /proc 输入 6.1. 使用/proc输入 7. 与设备文件对话 7.1. 与设备文件对话 (writes and IOCTLs)} 8. 操作系统调用 8.1. 操作系统调用 9. 阻塞进程 9.1. 阻塞进程 10. 覆盖Printks 10.1. ...
在这个架构中,文件系统位于核心内核之中,它与其他组件(如内存管理、进程管理等)紧密协作,以确保文件的有效管理和安全访问。 #### 文件系统的层次结构 为了实现高效的文件管理,Linux采用了多层次的设计思路:...
- C++:Windows下可利用`CreateToolhelp32Snapshot`和`Process32First/Next`函数,Linux下使用`procfs`文件系统进行读取。 五、安全注意事项 获取进程信息时应遵守相应的权限限制,避免非法访问其他用户的进程。在...
procfs该软件包提供了从伪文件系统/ proc和/ sys中检索系统,内核和进程指标的功能。 警告:此程序包正在进行中。 其API可能仍会以向后不兼容的方式中断,而不会发出警告。 需要您自担风险使用它。 用法procfs库由...
在Linux内核中,procfs通过文件系统接口来模拟文件和目录。尽管Linux 0.11没有完整的虚拟文件系统支持,但可以通过修改现有的Minix文件系统来模拟procfs。这涉及到添加一个新的文件类型,比如proc文件,并为其编写...
在嵌入式Linux系统中,选择合适的文件系统对于提高系统的稳定性和性能至关重要。本文档将详细介绍几种常用的文件系统,包括它们的特点、应用场景以及如何正确配置和使用。 #### 二、文件系统类型及其特点 1. **...
Craft.io 此板条箱是linux上proc伪文件系统的接口,通常以/proc挂载。 从长远来看,此板条箱旨在使功能完全完善,但目前并非所有文件都已公开。 请参阅文档以获取有关受支持内容的信息,或在代码存储库中查看文件。...
1. **读取/proc文件系统**:Linux将进程信息存储在/proc目录下的相应PID的子目录中。可以通过遍历/proc目录,读取每个子目录下的status文件来获取进程信息。 2. **使用`ps`命令**:通过`system()`函数调用`ps`命令,...
实验“lab3_procfs_实验说明1”主要涉及Linux内核模块开发,特别是如何利用procfs文件系统实现内核与用户空间的数据交互。Procfs是一个虚拟文件系统,它提供了查看和修改内核状态的接口。在这个实验中,我们将创建一...
通过修改内核中的`task_struct`结构体中的`hide`变量,可以实现进程在Proc文件系统中的隐藏,使得`ps`命令无法显示该进程。当`hide`变量为0时,进程才会出现在Proc目录中。 **实验步骤** 1. 使用`cd /proc`进入Proc...
该软件包提供了从伪文件系统/ proc和/ sys中检索系统,内核和进程指标的功能。 警告:此软件包正在开发中。 其API可能仍会以向后不兼容的方式中断,而不会发出警告。 需要您自担风险使用它。 用法 procfs库由软件包...