3、调用proc_register把ent加入proc文件系统(即proc文件树)中。

4、返回ent;

proc_register函数

这个函数把一个proc文件加入到proc文件树中,其函数原型如下:

static int proc_register(struct proc_dir_entry *parent,struct

proc_dir_entry *ent)

其主要流程如下:

1、使用make_inode_number()函数动态的到一个节点号,并且设置low_ino.注意只是获得inod编号,并不是真的创建inode.该inode的创建会推迟到proc_lookup中。

2、将这个proc_dir_entry结构链接到它的父节点上。

3、根据文件类型(普通文件,目录,symbolic)的不同,设置不同的缺省操作函数集。

删除proc文件remove_proc_entry

这个函数用来删除一个proc文件,注意如果该文件正被使用那么只是设置deleted标志,该函数的原型:

void remove_proc_entry(const char *name,struct proc_dir_entry

*parent);

其中name是待删除的proc文件。parent是该文件的父目录.

其执行流程如下:

1、确定其父目录.乳沟parent有效,则执行2.否则(parent ==

NULL)尝试从name分析出parent,如果分析失败则函数返回失败,否则执行2.

2、在parent中找出待删的文件对应的proc_dir_entry实例ent.

3、把ent从proc文件树中删除,并更新树的状态。

4、如果该文件被使用则设置deleted标识(在其后的恰当时候会被释放),否则调用free_proc_entry

其他proc文件操作函数

struct proc_dir_entry *proc_mkdir(const char *name,struct

proc_dir_entry *parent);

这个函数用来在proc文件系统中创建一个设别文件,因此,在创建proc_dir_entry结构后,没有设置缺省操作,而是使用ent->rdev

= rdev指定了设备。最后,调用proc_registera函数将其注册。

struct proc_dir_entry *proc_symlink(const char *name,struct

proc_dir_entry *parent,const char

*dest)函数,该函数创建了一链接文件,使用ent->mode =

S_IFLNK|S_IRUGO|S_IXUGO来标志,它和其他文件的建立很相似,只是,它将链接的目标文件名放在了ent->data域中。最后,它同样调用proc_register函数将该结构注册。

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)

创建只读的proc文件,并且设置其对应的proc_dir_entry中的read_proc成员。

void create_seq_entry(char *name,mode_t mode ,struct

file_operations *f)

在/proc目录下创建一个文件,其文件操作函数由f指定

内核还定义了很多其他的创建proc文件的方式,可以参考源代码

假设现在有一个线程组,其TGID为32182,其包含了两个线程:32182,32255.那么:执行ls

/proc,则能看到有一个32182的目录;执行ls /proc/32182则能看到该线程组的信息;执行ls

/proc/32182/task则能看到两个32182,32255

;执行ls /proc/32182/task/32182则能看到该task实例的信息;但如果我们执行ls

/proc/32255也能得到和执行ls /proc/32182同样的效果

假设有一个线程组,其TGID为32243,其包含一个线程:32243.那么其效果类似上面的情况。

注意:针对/proc/TGID目录下的各个文件,内核定义了一个全局属祖tgid_base_stuff用来约定各个文件的基本信息,这个数据的元素的类型是pid_entry。同样,内核也为/proc/TGID/task/PID目录下的文件定义了全局数组tid_base_stuff.cd

ptg

/proc/tgid目录的创建时机

(/proc/下的进程目录)

当执行ls /proc是并不会创建线程组的相应目录,而只是告诉你这个时刻的线程组的存在。只有当执行ls

/proc/tgid时,才会创建线程组相应的inode。即相应的inode实例是动态创建的

事实上,当执行ls

/proc时会调用proc_root_readdir(通过proc_root_operations)列出/proc目录下的所有文件。针对/proc下的线程组,该函数会查询内核的tgid链表。得到所有的tgid。然后转化成字符串....

而当执行ls

/proc/TGID时最终会调用proc_root_lookup(通过proc_root_inode_operations),这个函数会为该目录创建inode(其实是proc_inode实例),然后设置相应的inode_op,file_op,dentry_op等等信息。然后再调用proc_tgid_base_readdir(通过proc_tgid_base_operations变量)。而该函数又调用proc_pident_readdir来获得/proc/TGID目录下的所有文件的名字。

即相应inode创建时机是:

proc_root_lookup----proc_pid_lookup---proc_pid_make_inode

注意:

proc_fs对进程目录与非进程目录的处理有很大区别。

ini

linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)相关推荐

  1. linux oracle 创建表空间2016,Linux下Oracle表空间及用户创建

    记录详细过程以备使用 Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as sys@i ...

  2. linux在当前目录下创建pic目录,在Linux上创建.SO文件而不使用PIC(与位置无关的代码)(x86 32位)...

    据我所知,x86汇编代码在很大程度上受寄存器数量的限制. 当我了解到在Linux上要创建一个.so文件时,必须为gcc指定-fPIC命令行参数才能创建与位置无关的代码,我不敢首先相信它. 据我所知,e ...

  3. 使用mkiso向服务器传文件,Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)

    mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mki ...

  4. Linux从头开始学--学习笔记9知识点补充-ubuntu,centos;在linux上创建c程序;linux基础命令,shell命令,vi命令,man帮助手册

    这是我从头开始学习Linux的学习笔记,后续还会更新. 记录自己的技术成长,也希望和大家分享交流,欢迎关注~ 本笔记为coursera网站课程<Linux for Developers>的 ...

  5. Linux中创建组的命令,linux创建用户组命令

    Linux 系统是下可以通过命令创建用户,当然也可以创建用户组,下面由学习啦小编为大家整理了linux创建用户组命令的相关知识,希望对大家有帮助! linux下创建用户组命令--groupadd命令 ...

  6. linux如何创建快捷,如何在Linux的桌面上创建快捷方式或启动器

    如果在Linux桌面系统中你经常使用一个程序,你可能想去创建一个"桌面快捷方式",以便于你在桌面只要点击一下快捷方式就可以启动它.虽然不少带有图形界面的程序会在安装时自动在桌面上创 ...

  7. 如何在linux终端创建txt文件,在Linux中,如何使用 命令行 快速创建一个文本文件...

    如果需要创建文本文件,有一些易于使用的方法. 创建文本文件的第一个方法使用"cat"命令,在提示符下键入以下命令并按Enter,cat > sample.txt 按Enter ...

  8. windows使用.NET CORE下创建MVC,发布到linux运行

    1.在有dotnet core 的环境下,打开控制台.创建文件夹demo1 2.创建MVC程序 3.创建完成 4.使用记事本修改一下HomeController 修改端口 5.发布 6.压缩发布的文件 ...

  9. Windows下创建PXE网络安装Linux[Redhat AS5.5]IBM X3650

    IBM x3650 M3服务器未配置DVD光驱,但提供了PXE网络方式安装,我们便通过一台普通PC机搭建PXE网络,安装Linux操作系统.由于M3系列的硬盘采用了最新的SATA方式传输,RedHat ...

  10. linux为什么创建不了分区,linux下扩容磁盘扩展分区解决因无法创建新分区不能扩容lvm问题...

    有一个/dev/sdc的盘,上面划分了3个主分区/dev/sdc1-3,一个扩展分区/dev/sdc4,在扩展分区上划分了一/dev/sdc5.问题来了,想扩容这个/dev/sdc硬盘,怎么新建分区或 ...

最新文章

  1. 测试打桩_DNF:CEO实测旭旭宝宝红眼,打桩高达2494E,伤害超越狂人剑魂
  2. Vmware安装提示在关闭以下进程 之前,无法进行安装的解决办法
  3. Windows Phone 7 学习网址总结
  4. 转:c# Linq 的分页[转]
  5. 红帽产品及技术总裁:未来IT趋势预测
  6. exit、break、continue的区别
  7. java json clone_再谈java clone 以及 浅/深拷贝
  8. ai里怎么做阴影效果_使用ai制作出文字阴影效果的详细方法
  9. linux ubuntu 五笔输入法,ubuntu16.04 安装五笔输入法
  10. 状态分布函数 详细介绍
  11. sci国外期刊投稿过程(已完结)
  12. Caused by: java.lang.ClassNotFoundException: org.jbpm.pvm.internal.processengine.SpringHelper
  13. 服务器被黑 追寻ip_网站服务器被攻击了如何查找木马(webshell)IP 篡改的痕迹...
  14. windows 没有应用商店,直接安装所需应用的解决方案
  15. 一.wireshark界面学习
  16. SEO高工资,你需要掌握什么能力?
  17. IOMMU/SMMUV3代码分析(1)SMMU设备的分配
  18. c语言程序设计实验与案例数组,新书推荐 | C语言程序设计+实验与题解
  19. 【安全研究】Linux后渗透常见后门驻留方式分析
  20. “双一流”高校停止专升本招生??

热门文章

  1. Azure Automation 自动化-自动关闭Azure
  2. .net API跨域
  3. μCUnit,微控制器的单元测试框架
  4. Hibernate的批量查询
  5. java selenium验证元素是否存在
  6. 彻底理解H5的DOM事件
  7. Android底层开发之Audio HAL Android Audio Overview
  8. 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)
  9. 39.什么是操作系统(os)
  10. 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化