Linux文件系统与设备文件

一、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 结构体指针 */
	}
	...
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8.12 矢量图层面要素单一符号使用十(箭头线渲染边界)

前言 本章介绍矢量图层线要素单一符号中箭头线渲染边界的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 箭头线渲染边界&#xff08;Outline: Arrow&#xff09; Outline系列只画边界&#xff0c;不填充内容以protected_areas.shp为例&#xff0c;图…

Spring 动态增强逻辑执行分析

1、假如UserService中存在被增强的public 普通方法&#xff0c;那么spring ioc时就会创建对应的代理对象放置到容器中&#xff1b; 2、那么Controller中注入的userService就是代理对象&#xff1b; Service public class UserService {Transactionalpublic void f2(String us…

【训练篇】MLU370-M8 完成 qwen1.5-7b-chat-lora训练及推理

文章目录 前言一、平台环境配置二、环境 or 模型准备1.模型下载2.环境准备2.1 modelscope2.2 transformers2.3 accelerate2.4 deepspeed2.5 peft2.6 环境代码修改 3训练代码准备4 代码修改 三&#xff0c;训练后推理验证四.推理效果展示1.微调前2.微调后 前言 本期我们采用魔塔…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

【高性能服务器】服务器概述

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 服务器概述 服…

[深入理解DDR] 总目录

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

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的&#xff0c;为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的&#xff0c;为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率&#xff0c;但多进程、多线程都存在局限性。比如多进程通过时…

第三方服务提供商的五大风险

亚马逊如何应对网络安全挑战 关键网络安全统计数据和趋势 移动优先世界中安全和隐私策略 当今数字时代网络安全的重要性 用户无法停止犯安全错误的 3 个原因 首席安全官可能过于依赖 EDR/XDR 防御 随着业务流程变得越来越复杂&#xff0c;公司开始转向第三方来提高其提供关…

Unity动画系统(1)

6.1 动画系统基础1-5_哔哩哔哩_bilibili 模型信息 Generic非人型 Configure 虚线圈可以没有&#xff0c;实线圈必须有&#xff0c;15个骨骼是必须的 p313 尾巴、翅膀属于非人型 p314 一般使用create from this model 游戏对象不再旋转 游戏对象不再发生位移 调整中心位置

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级&#xff01;首推专题区(推荐分类)更多自定义颜色&#xff01;选择自己喜欢的色系&#xff0c;焕然一新的UI设计&#xff0c;更加扁平和现代化&#xff01; WP黑格导航主题BlackCandy

springcloud第4季 分布式事务seata实现AT模式案例2【经典案例】

一 seata案例 1.1 背景说明 本案例使用seata的at模式&#xff0c;模拟分布式事务场景&#xff1a;【下订单&#xff0c;减库存&#xff0c;扣余额&#xff0c;改状态】 AT模式原理&#xff1a;是2pc方案的演变&#xff0c; 一阶段&#xff1a;业务数据和回滚日志记录在同一…

kubernetes中使用Helm搭建Redis集群

1. 环境要求 首先需要有kubernetes集群环境&#xff0c;搭建kubernetes集群可以使用kubeSphere、kubespray等工具安装集群。其次要安装helm&#xff0c;并且添加了可用的Chart仓库 2. 确认合适的Chart包 helm官网上搜索redis 找到Star数多的Chart包&#xff0c;一类是redis包…

JVM(12):虚拟机性能分析和故障解决工具之JConsole

1 JConsole作用 查看Java应用程序的运行概况&#xff0c;监视垃圾收集器管理的虚拟机内存(堆和元空间)的变化趋势&#xff0c;以及监控程序内的线程。 2 使用说明 代码如下&#xff1a; package com.example.demo;import java.io.IOException; import java.util.ArrayList; …

04.Ambari自定义服务开发-自定义服务配置文件在Ambari中的设置方法

文章目录 设置方法配置文件设置Custom xxx配置文件详细的配置方法.xml文件的整体格式基础参数格式value-attributes配置介绍设置属性在服务安装后不可修改设置允许字段为空是否显示配置名称参数类型设置字符串类型PasswordBooleanIntFloatDirectoryDirectoriesContent-多行文本…

2024 vue3入门教程:windows系统下部署node环境

一、打开下载的node官网 Node.js — 下载 Node.js 二、根据个人喜好的下载方法&#xff0c;下载到自己的电脑盘符下 三、我用的是方法3下载的压缩包&#xff0c;解压到E盘nodejs目录下&#xff08;看个人&#xff09; 四、配置电脑的环境变量&#xff0c;新建环境变量的时候…

【Flink】Flink SQL

一、Flink 架构 Flink 架构 | Apache Flink 二、设置TaskManager、Slot和Parallelism 在Apache Flink中&#xff0c;设置TaskManager、Slot和Parallelism是配置Flink集群性能和资源利用的关键步骤。以下是关于如何设置这些参数的详细指南&#xff1a; 1. TaskManager 设置 …

【TB作品】智能台灯控制器,ATMEGA128单片机,Proteus仿真

题目 8 &#xff1a;智能台灯控制器 基于单片机设计智能台灯控制器&#xff0c;要求可以调节 LED 灯的亮度&#xff0c;实现定时开启与关闭&#xff0c; 根据光照自动开启与关闭功能。 具体要求如下&#xff1a; &#xff08;1&#xff09;通过 PWM 功能调节 LED 灯亮度&#x…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​&#xfeff;​​​​&#xfeff;‍​‍​‌&#xfeff;⁠‬&#xfeff;&#xfeff;&#xfeff;​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

Java 并发编程常见问题

1、线程状态它们之间是如何扭转的&#xff1f; 1、谈谈对于多线程的理解&#xff1f; 1、对于多核CPU&#xff0c;多线程可以提升CPU的利用率&#xff1b; 2、对于多IO操作的程序&#xff0c;多线程可以提升系统的整体性能及吞吐量&#xff1b; 3、使用多线程在一些场景下可…

前端笔记-day11

文章目录 01-空间-平移02-视距03-空间旋转Z轴04-空间旋转X轴05-空间旋转Y轴06-立体呈现07-案例-3D导航08-空间缩放10-动画实现步骤11-animation复合属性12-animation拆分写法13-案例-走马灯14-案例-精灵动画15-多组动画16-全民出游全民出游.htmlindex.css 01-空间-平移 <!D…