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.dentrystruct 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_SECURITYvoid *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.mzph.cn/bicheng/38220.shtml

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

相关文章

MySQL高级-索引-使用规则-SQL提示(use、ignore、force)

文章目录 1、查看表 tb_user2、展示索引3、为profession、age、status创建 联合索引4、查询 profession软件工程5、执行计划 profession软件工程6、创建profession单列索引7、再次执行计划 profession软件工程8、SQL提示8.1、use index(idx_user_pro)8.2、ignore index(idx_use…

最流行的文件同步软件

PanguFlow是一款免费的文件同步软件&#xff0c;他支持文件的全量同步、支持文件的增量同步、支持文件的实时备份&#xff0c;支持双向同步&#xff0c;支持三向同步甚至多向同步&#xff0c;支持无人值守运行。 PanguFlow数据同步软件下载地址https://pan.baidu.com/s/1GLjFR…

springcloud第4季 seata报could not find any implementation for class

一 问题说明 1.1 描述 在使用seata2.0alibaba-cloud 2022.0.0.0-RC2nacos 2.2.3 模拟下订单分布式事务场景&#xff0c;出现如下问题&#xff1a;java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 查看服务端&#xff1a;java.util.ServiceCo…

imx6ull/linux应用编程学习(6)jpeg和png的图片显示

1.JPEG图片显示 JPEG&#xff08;Joint Photographic Experts Group&#xff09;是由国际标准组织为静态图像所建立的第一个国际数字图像压缩标准&#xff0c;也是至今一直在使用的、应用最广的图像压缩标准。JPEG 由于可以提供有损压缩&#xff0c;因此压缩比可以达到其他传统…

【解释】i.MX6ULL_IO_电气属性说明

【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞&#xff08;Hysteresis&#xff09;是什么&#xff1f;1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…

企业化运维(6)_redis数据库

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis是一个key-value存储系统。和Memcached类似&#xff0…

C#进阶-ASP.NET WebForms调用ASMX的WebService接口

ASMX 文件在 ASP.NET WebForms 中提供了创建 Web 服务的便捷方式&#xff0c;通过公开 Web 方法&#xff0c;允许远程客户端调用这些方法并获取数据。本文介绍了 ASMX 文件的基本功能、如何定义 WebService 接口、通过 HTTP 和 SOAP 请求调用 WebService 接口&#xff0c;以及使…

bgr24包装为bmp图像

code void BGR24ToBMP(const int width, const int height, uint8_t *framedata, const char *outfile) {BITMAPFILEHEADER bmp_header; // 声明BMP文件的头结构BITMAPINFOHEADER bmp_info; // 声明BMP文件的信息结构unsigned int data_size (width * 3 3) / 4 * 4 * heig…

[AIGC] Shell脚本在工作中的常用用法

Shell脚本是一种为 shell 编写的脚本程序。商业上的 Unix Shell 一般都配备图形界面&#xff0c;主要包括&#xff1a;Bourne Shell&#xff08;/usr/bin/sh或/bin/sh&#xff09;、Bourne Again Shell&#xff08;/bin/bash&#xff09;、C Shell&#xff08;/usr/bin/csh&…

简单多状态DP问题

这里写目录标题 什么是多状态DP解决多状态DP问题应该怎么做&#xff1f;关于多状态DP问题的几道题1.按摩师2.打家劫舍Ⅱ3.删除并获得点数4.粉刷房子5.买卖股票的最佳时期含手冷冻期 总结 什么是多状态DP 多状态动态规划&#xff08;Multi-State Dynamic Programming, Multi-St…

vue2实例实现一个初步的vue-router

vue2实例实现一个初步的vue-router 实现源码&#xff1a;vue2-review 1.App.vue 2.router目录下的index.js 3.自己实现的x-router.js 4.自己实现的xrouter-view.js 5.自己实现的xrouter-link.js 6.效果 微信公众号&#xff1a;刺头拾年

AI奥林匹克竞赛:Claude-3.5-Sonnet对决GPT-4o,谁是最聪明的AI?

目录 实验设置 评估对象 评估方法 结果与分析 针对学科的细粒度分析 GPT-4o vs. Claude-3.5-Sonnet GPT-4V vs. Gemini-1.5-Pro 结论 AI技术日新月异&#xff0c;Anthropic公司最新发布的Claude-3.5-Sonnet因在知识型推理、数学推理、编程任务及视觉推理等任务上设立新…

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

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

【动态规划】139. 单词拆分

139. 单词拆分 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字…

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹&#xff08;三维建模&#xff09;》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台&#xff0c;平台的自定位误差将影响SAR…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

还不知道工业以太网和现场总线区别???

工业以太网 工业以太网是一种专为工业环境设计的网络通信技术&#xff0c;它基于标准的以太网技术&#xff0c;但针对工业应用进行了优化。工业以太网能够适应高温、低温、防尘等恶劣工业环境&#xff0c;采用TCP/IP协议&#xff0c;与IEEE 802.3标准兼容&#xff0c;并在应用层…

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目&#xff0c;发现项目连接Mysq总是连接不上&#xff0c;查了url、ip、port、用户名和密码都没有错&#xff0c;就是连接不上mysql数据库&#xff0c;后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…