cdev linux_手把手教Linux驱动4-进程、文件描述符、file、inode关系详解

本文详细介绍了Linux中文件描述符的概念及其与进程、inode、file结构体的关系。讨论了设备文件,特别是字符设备在Linux系统中的工作原理,并通过实例解释了如何查看和管理文件描述符。同时,提到了驱动程序如何与设备文件交互以及可能出现的"Too many open files"问题。
摘要由CSDN通过智能技术生成

本文目标

  1. 什么是文件描述符?

  2. 进程打开文件相关信息管理

  3. Linux设备文件三大结构:inode,file,file_operations

  4. mknod 做了什么事?

  5. 进程打开设备文件

  6. 驱动如何支持同类型设备?

  7. 如何获得注册的设备结构体私有地址?

Linux 中一切都可以看作文件,包括普通文件、链接文件、Socket 以及设备驱动等,对其进行相关操作时,都可能会创建对应的文件描述符。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,用于指代被打开的文件,对文件所有 I/O 操作相关的系统调用都需要通过文件描述符。

Linux启动后,会默认打开3个文件描述符,分别是:

0:标准输入 standard input

1:正确输出 standard output

2:错误输出 error output

这就是为什么我们在程序运行时可以直接打印信息和从命令终端获取信息的原因。

并且以后打开文件后。新增文件绑定描述符 可以依次增加(从3开始累加)。每一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。

712136580e8535ab206cea7ff7e505d6.png在这里插入图片描述

  • 进程级别的文件描述符表files_struct:内核为每个进程维护一个文件描述符表,该表记录了文件描述符的相关信息,包括文件描述符、指向打开文件表中记录的指针。

  • 系统级别的打开文件表file:内核对所有打开文件维护的一个进程共享的打开文件描述表,表中存储了处于打开状态文件的相关信息,包括文件类型、访问权限、文件操作函数(file_operations)等。

  • 系统级别的 i-node 表:i-node 结构体记录了文件相关的信息,包括文件长度,文件所在设备,文件物理位置,创建、修改和更新时间等,"ls -i" 命令可以查看文件 i-node 节点。

进程在Linux内核中是由结构体task_struct维护,进程打开的所有文件描述符都在进程维护的结构体task_struct的files变量中维护:

//includelinuxsched.hstruct task_struct {      ……  /* open file information */      struct files_struct *files;      ……}

该结构体定义如下:

/* * Open file table structure */struct files_struct {  /*   * read mostly part   */    atomic_t count;    struct fdtable __rcu *fdt;    struct fdtable fdtab;  /*   * written part on a separate cache line in SMP   */    spinlock_t file_lock ____cacheline_aligned_in_smp;    int next_fd;    unsigned long close_on_exec_init[1];    unsigned long open_fds_init[1];    struct file __rcu * fd_array[NR_OPEN_DEFAULT];};

该进程所有打开的文件对应的file指针均由fd_array维护,文件描述符和数组下标一一对应。

文件描述符是一种系统资源,可以通过以下命令来查看文件描述符的上限。

查看所有进程允许打开的最大 fd 数量eeaf359950bbfc0a3f878833ff466079.png

查看所有进程已经打开的 fd 数量以及允许的最大数量fc887f52c4fa3681320ffc57466a6d3b.png

查看单个进程允许打开的最大 fd 数量.c774778fe335c9a277f252cd51729be3.png

查看某个文件被哪些进程打开?

可以借助lsof命令编写调试代码如下:ab345ecff7eda465cdb7c40add558609.png

该代码功能是打开文件test,然后休眠100秒,我们需要在这100秒内执行lsof操作。10b25091af00a982d1a0f16ce37b816d.pngca480310d8675ac7189149e22ddbb40c.png

&是程序放在后台运行,为了释放终端,方便输入下一个命令;

7284:程序进程ID;

lsof功能:查看某个文件被进程打开的详细信息。

查看某个进程打开了哪些文件?

接着上述的例子,ls -l /proc/{PID}/fd 可以查看某个进程打开了哪些文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值