Linux文件系统与设备文件

news2024/7/2 21:29:48

一、Linux文件操作

Linux的文件系统API主要涉及创建、打开、读写、定位、关闭文件

创建

int creat(const char *filename, mode_t mode);
  • mode: 代表新建文件的存取权限,需要和umask相与才能确定最终权限(mode&umask)。在这里插入图片描述

  • umask代表文件在创建时需要去掉的存取权限

打开

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • flags可以是一个值或几个值的组合,其中O_RDONLYO_WRONLYO_RDWR只能使用一个在这里插入图片描述
  • 如果使用了O_CREATE, 则需要加mode参数表示文件的访问权限

读写

int read(int fd, const void *buf, size_t length);
int write(int fd, const void *buf, size_t length);
  • buf指向缓冲区的指针,length代表缓冲区大小(byte)
  • read()是从fd中读取length字节到buf中,返回实际读取的字节数
  • write()是把length个字节从buf写到fd中,返回实际写入的字节数

定位

int lseek(int fd, offset_t offset, int whence);
  • 讲文件的读写指针相对whence移动offset字节,成功返回读写指针相对于文件头的位置
  • whence代表相对位置,可以使用以下的值:在这里插入图片描述
  • offset可以取负值,代表相对于当前位置向前移

关闭

int close(int fd);
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#define LENGTH 100
main()
{
	int fd, len;
	char str[LENGTH];
	/* 创建并打开文件 */
	fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /*	
	if (fd) {
		/* 写入字符串 */
		write(fd, "Hello World", strlen("Hello World")); /*
		/* 关闭文件 */
		close(fd);
	}

	fd = open("hello.txt", O_RDWR);
	 /*  读取文件内容 */
	len = read(fd, str, LENGTH);
	str[len] = '\0';
	printf("%s\n", str);
	close(fd);
}

二、LInux文件系统

1. 目录结构

/bin: 包含基本命令,如ls、cp、mkdir等,这个目录中的文件都是可以执行的
/sbin: 大多涉及到系统管理的命令,如modprobe、hwclock、ifconfig等,也都是可以执行的
/dev: 设备文件存储目录,应用程序通过对这些文件的读写和控制来访问实际的设备
/etc: 存放系统和一些服务器配置文件,如用户账号和密码配置文件。
/lib: 存放系统库目录
/mnt: 用于存放挂载存储设备
/opt: option可选,有些软件包安装在此处
/proc: 存放操作系统运行时的进程及内核信息的伪目录,实际的信息在内存之中
/tmp: 用来存放临时文件
/usr: 存放程序目录,如用户命令、用户库等
var:存放经常变动的内容,如存放系统日志
/sys: sysfs文件系统映射在此目录,Linux设备驱动模型中的总线、驱动和设备都可以在此种找到对应的节点

2. 文件系统与设备驱动

在这里插入图片描述
1. 应用程序VFS(虚拟文件系统)之间的接口就是系统调用,即Linux文件系统(或C库)的API,包括read()write()等函数
2. VFS与文件系统以及设备文件之间的接口是file_operations结构体成员函数,这个结构体实现了相关设备的xxx_open()xxx_write()xxx_read()等函数
3. 块设备有两种访问方式
- 第一种是不通过文件系统访问直接访问裸设备,内核同一实现了def_blk_fops这一file_operations
- 第二种则是通过文件系统访问块设备,file_operations的实现位于文件系统内部,文件系统给会将针对文件的读写转为针对块设备原始扇区的读写。如ext2、fat等文件系统会实现针对VFS的file_operations结构体成员函数。

file结构体
当应用程序通过VFS调用open函数打开一个文件时,系统会为该文件在内核中关联一个file结构体。这个结构体在文件打开时由内核创建,并且对这个文件进行任何操作的函数(如read、write、seek等)都会得到这个结构体,在这个文件的所有实例关闭后该结构体会被内核释放。

struct file {
	union {
		struct llist_node fu_llist;
		struct rcu_head fu_rcuhead;
	} f_u;
	struct path f_path;
	#define f_dentry f_path.dentry
	struct inode *f_inode; /* cached value */
	const struct file_operations*f_op; /*  和文件关联的操作 */

	/*
	* Protects f_ep_links, f_flags.
	* Must not be taken from IRQ context.
	*/
	spinlock_t f_lock;
	atomic_long_t f_count;
	unsigned int f_flags; /* 文件标志,如 O_RDONLY 、 O_NONBLOCK 、 O_SYNC*/
	fmode_t f_mode; /* 文件读 / 写模式, FMODE_READ 和 FMODE_WRITE*/
	struct mutex f_pos_lock;
	loff_t f_pos; /*  当前读写位置 */
	struct fown_struct f_owner;
	const struct cred *f_cred;
	struct file_ra_statef_ra;

	u64 f_version;
	#ifdef CONfiG_SECURITY
	void *f_security;
	#endif
	/* needed for tty driver, and maybe others */
	void *private_data; /* 文件私有数据 */

	#ifdef CONfiG_EPOLL
	/* Used by fs/eventpoll.c to link all the hooks to this file */
	struct list_head f_ep_links;
	struct list_head f_tfile_llink;
	#endif /* #ifdef CONfiG_EPOLL */
	struct address_space*f_mapping;
 }__attribute__((aligned(4))); /* lest something weird decides that 2 is OK */

inode结构体
inode结构体包含文件自身的属性信息,包括访问权限、所属组、大小、生成时间等等

struct inode {
	...
	umode_t i_mode; /* inode 的权限 */
	uid_t i_uid; /* inode 拥有者的 id */
	gid_t i_gid; /* inode 所属的群组 id */
	dev_t i_rdev; /*  若是设备文件,此字段将记录设备的设备号 */
	loff_t i_size; /* inode 所代表的文件大小 */
	
	struct timespec i_atime; /* inode 最近一次的存取时间 */
	struct timespec i_mtime; /* inode 最近一次的修改时间 */
	struct timespec i_ctime; /* inode 的产生时间 */
	
	unsigned int i_blkbits;
	blkcnt_t i_blocks; /* inode 所使用的 block 数,一个 block 为 512  字节 */
	union {
	struct pipe_inode_info *i_pipe;
	struct block_device *i_bdev;
	/*  若是块设备,为其对应的 block_device 结构体指针 */
	struct cdev *i_cdev; /*  若是字符设备,为其对应的 cdev 结构体指针 */
	}
	...
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1880394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper:Zookeeper JavaAPI操作与分布式锁

文章目录 一、Zookeeper JavaAPI操作1、Curator介绍2、创建、查询、修改、删除节点3、Watch事件监听 二、Zookeeper分布式锁原理 一、Zookeeper JavaAPI操作 1、Curator介绍 Curator是Apache Zookeeper的Java客户端。常见的Zookeeper Java API&#xff1a; 原生Java API。ZkC…

[深入理解DDR] 总目录

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门&#xff0c;点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论&#xff1a;DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存&#xff1f;内存与存…

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…

RedisAtomicInteger并发案例

&#x1f370; 个人主页:__Aurora__ &#x1f35e;文章有不合理的地方请各位大佬指正。 &#x1f349;文章不定期持续更新&#xff0c;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ RedisAtomicInteger 提供了对整数的原子性操作&a…

策略模式在金融业务中的应用及其框架实现

引言 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不修改客户端代码的情况下&#xff0c;动态地改变一个类的行为。它通过定义一系列算法并将它们封装在独立的策略类中&#xff0c;使这些算法可以互相替换&#xff0c;而不会影响…

PyTorch使用GPU进行Tensor及模型计算

文章目录 1. 计算设备&#xff1a;GPU/CPU2. Tensor的GPU计算3. 模型的GPU计算 对复杂的神经网络和大规模的数据来说&#xff0c;使用CPU来计算可能不够高效。这里&#xff0c;我们将介绍如何使用单块NVIDIA GPU来计算。 首先&#xff0c;需要确保已经安装好了PyTorch GPU版本…

ThreadPoolExecutor 工作线程Worker自身锁设计

个人博客 ThreadPoolExecutor 工作线程Worker自身锁设计 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker&#xff0c;主…

谷歌个人号,20人连续封测14天所需设备该怎么解决?

现在&#xff0c;在Google Play上架应用&#xff0c;对于大部分开发者来说&#xff0c;真的是不小的挑战&#xff0c;因为目前谷歌上架政策越来越严格了。特别是从2023年11月13日起&#xff0c;新政策要求个人开发者账号的应用必须经过20个独立用户连续14天的封闭测试&#xff…

人工智能 (AI) 在能源系统中应用的机会和风险

现代文明极度依赖于电力的获取。电力系统支撑着我们视为理所当然的几乎所有基本生活功能。没有电力的获取&#xff0c;大多数经济活动将是不可能的。然而&#xff0c;现有的电网系统并未设计来应对当前——更不用说未来的——电力需求。与此同时&#xff0c;气候变化迫切要求我…

基于STM32的智能家用安全监控系统

目录 引言环境准备智能家用安全监控系统基础代码实现&#xff1a;实现智能家用安全监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;安全监控管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用安全监控系…

【C++深度探索】继承机制详解(一)

hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1…

git客户端工具之Github,适用于windows和mac

对于我本人&#xff0c;我已经习惯了使用Github Desktop,不同的公司使用的代码管理平台不一样&#xff0c;就好奇Github Desktop是不是也适用于其他平台&#xff0c;结果是可以的。 一、克隆代码 File --> Clone repository… 选择第三种URL方式&#xff0c;输入url &…

汽车电子行业知识:什么是车载智能座舱

1.什么是车载智能座舱 车载智能座舱是指搭载在汽车内部的一种智能系统&#xff0c;它集成了各种功能和技术&#xff0c;旨在提升驾驶体验、增加安全性和提供更多的便利。这种系统可以包括诸如智能驾驶辅助、信息娱乐、智能语音控制、车内环境控制、车辆健康监测等功能。通过车…

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(3)专栏里有上两步的源代码

创建用户登录程序&#xff0c;验证用户账号和密码信息是否在数据库student中的用户表tb_account中存在。用户登录界面如下图所示&#xff1a; 当单击“登录”按钮时&#xff0c;处理以下几种情况&#xff1a; &#xff08;1&#xff09;用户名未输入&#xff0c;提示用户名不能…

Java_日志

日志技术 可以将系统执行的信息&#xff0c;方便的记录到指定的位置(控制台、文件中、数据库中) 可以随时以开关的形式控制日志启停&#xff0c;无需侵入到源代码中去进行修改。 日志技术的体系结构 日志框架&#xff1a;JUL、Log4j、Logback、其他实现。 日志接口&#xf…

搭建ragflow的步骤

前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 如果你并没有在本机安装 Docker&#xff08;Windows、Mac&#xff0c;或者 Linux&#xff09;, 可以参考文档 Install Docker Engine 自行安装。 启动服务器 …

MISRA C

介绍 MISRA C 是由汽车产业软件可靠性协会&#xff08;Motor Industry Software Reliability Association&#xff09;提出的 C 语言编程标准&#xff0c;可提高嵌入式系统软件的安全性和可靠性。这些指南由汽车制造商、零部件供应商和工程咨询公司合作的汽车工业软件可靠性协…

STM32G4系列之DAC

一、STM32G4单片机有几个DAC外设&#xff1f; STM32G4单片机共有4个DAC&#xff0c;两个为低速DAC(采样率1MHz)&#xff0c;两个为高速DAC(采样率15MHz)。共包括7个通道&#xff0c;3个外部通道和4个内部通道。 三个外部DAC包括DAC1和DAC2&#xff0c;其可以映射到外部管脚&am…

捕获野生的登录页,暴改Vue3

1.实现效果 2.Vue组件 <script setup> import {onMounted} from "vue";onMounted(()>{// getAllData() }) </script><template><div class"login"><div class"form-cont"><div class"form-top"&…