网站首页 > 技术教程 正文
括号中的字符表示文件类型。在Linux系统中,可通过执行ls -l命令查看文件类型。 ls -l命令可以列出文件的详细信息,包括文件类型,文件类型显示在每行的第一个字符中。
# ls -l
-rw-r--r-- 1 root root 748 Jul 10 09:47 test.c
那么,这7种文件具体都是什么文件,它们有什么作用呢?带着这个问题,我们开始本章内容的学习。
structinode
{
umode_t i_mode;//文件类型和权限
loff_t i_size; // 文件大小(字节)
unsignedshort i_bytes; // 文件的字节数
blkcnt_t i_blocks; // 文件占用的块数
structinode_operations *i_op;// inode 操作函数指针
structfile_operations *i_fop;// file 操作函数指针
structaddress_space *i_mapping;// 文件的地址空间对象
};
i_op
管理 inode元数据操作 (如创建/删除文件),而 i_fop
管理 文件被打开后的操作 (如读写数据),分别对应 struct inode_operations
和 struct file_operations
接口。 管道文件是一种特殊的文件,用于实现本机进程间通信。管道文件(匿名管道和命名管道等)只是内核定义的环形缓冲区。 环形缓冲区是一种固定大小的先进先出(FIFO)数据结构,当缓冲区达到最大容量时,新的数据会覆盖最旧的数据,从而实现数据的循环存储和高效利用。环形缓冲区定义了 写端 和 读端 ,写端负责将数据写入环形缓冲区,读端负责从环形缓冲区读取数据。
图4 管道文件
以匿名管道为例,如图4所示。用户程序通过pipe函数创建了一个管道文件,内核会定义一个环形缓冲区。pipe函数调用成功后会返回两文件描述符,这个文件描述符分别对应环形缓冲区的读端和写端。用户程序可以通过这两个文件描述符来读写环形缓冲区。由于管道文件对应的环形缓冲区属于内核级别,对于系统中的所有进程都是可见的,所以管道文件通常会用来实现本机进程间通信。
字符设备文件是一种特殊文件,用于访问字符设备。字符设备是以字符流的方式与用户空间程序进行交互的硬件设备,例如串行端口、键盘、鼠标等。字符设备文件提供了一种标准化的接口,使得用户可以通过文件操作(如open、read、write、close)来访问硬件设备。
图5 字符设备文件
字符设备文件实现原理如图5所示。字符设备文件通常位于/dev目录下,dev目录属于devtmpfs文件系统,devtmfps文件系统用来管理字符设备和块设备。字符设备文件通常由内核来创建,创建步骤如下:
dev_t devno;
//方法1:静态分配(需确保设备号未被占用)
register_chrdev_region(devno, count, "mydev");
//方法2:自动分配主设备号
alloc_chrdev_region(&devno, 0, 1, "mydev");
cdev表示一个字符设备。
struct cdev my_cdev;
cdev_init(&my_cdev, &fops); //初始化cdev并关联file_operations
fops为file操作函数集,需由用户自行定义,示例如下:
static struct file_operations fops = {
.open = device_open,
.release = device_release,
.read = device_read,
.write = device_write,
};
static int device_open(struct inode *inode, struct file *file) {
printk(KERN_INFO "Device opened\n");
return0;
}
static int device_release(struct inode *inode, struct file *file) {
printk(KERN_INFO "Device closed\n");
return0;
}
static ssize_t device_read(struct file *file, char __user *buffer, size_t length, loff_t *offset) {
printk(KERN_INFO "Device read\n");
return0;
}
static ssize_t device_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset) {
printk(KERN_INFO "Device write\n");
return length;
}
cdev_add(&my_cdev, devno, 1); // 注册设备
// 创建设备类
structclass *cls = class_create(THIS_MODULE, "my_class");
// 生成设备节点
device_create(cls, NULL, devno, NULL, "mydevice");
经过上述步骤就能够在/dev目录下创建一个字符设备文件mydevice,用户程序通过文件路径/dev/ mydevice 就能够读写该字符设备。内核会根据/dev/ mydevice 文件路径查找到字符设备对应的inode,inode结构的i_fop成员指向用户自定义的file操作函数集,用户程序读写字符设备最终执行的是自定义的读写函数。
我们可以换一个角度来理解字符设备文件,用户程序想要在内核执行一段特定代码(由用户自行定义)。用户通过字符设备的file操作函数集来定义这些函数,最后用户程序通过字符设备文件调用这些函数。
6.块设备文件
块设备是以 固定大小的数据块 (通常为512B-4KB)为最小存储单元的硬件设备,支持 随机访问 (如硬盘、SSD、U盘),块设备的核心特点:
open
、 read
、 write等
)。 由于 7种文件类型属于不同的文件系统(部分文件类型属于相同文件系统),所以7种文件类型实现的功能会存在差异。要想真正理解“ Linux一切皆文件 ”这种设计思想,我们需要多去研究VFS。 - 上一篇: apache maven怎么卸载
- 下一篇: 【Linux学习】根目录常用文件夹功能介绍
猜你喜欢
- 2025-08-02 松勤软件测试:Linux进阶课:目录(文件夹)与文件操作
- 2025-08-02 Linux系统目录结构
- 2025-08-02 彻底清理UEFI启动菜单!手把手教你删除无用引导项!
- 2025-08-02 Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器
- 2025-08-02 Linux技巧:cp命令自动创建不存在的目录和只复制修改的文件
- 2025-08-02 tmpwatch命令清除旧文件
- 2025-08-02 第四章 Linux常用shell命令-4.5.磁盘管理
- 2025-08-02 Linux文件和目录管理常用重要命令(一)
- 2025-08-02 一天一个Linux命令:文件操作「删」rm
- 2025-08-02 【Linux学习】根目录常用文件夹功能介绍
你 发表评论:
欢迎- 08-06linux 和 windows文件格式互相转换
- 08-06谷歌 ChromeOS 已支持 7z、iso、tar 文件格式
- 08-06Linux下比较文件内容的6种方法
- 08-06文件格式及功能汇总
- 08-0610个Linux文件内容查看命令的实用示例
- 08-06Linux-如何区分不同文件类型
- 08-06Zabbix技术分享——监控windows进程资源使用情况
- 08-06Linux系统卡顿?学会ps命令这三招,轻松定位问题进程
- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)