【Linux】文件IO系统[ 库函数 ]封装了[ 系统调用 ] +【区分文件结构体FILE和file与files_srtuct表】(读写接口盘点与介绍)

news2024/11/23 17:19:37

前言

大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • ※学习文件IO必须知道的概念
    • 1. 认识 [ 系统调用 ] 和 [ 库函数 ]
    • 2. 区分内核文件结构体file和files_struct&C标准库中文件结构体FILE
    • 3.延申:思考硬件层面与内核的交互(形成多态)
  • 一.【库函数】回顾c语言中读写文件的方式
  • 二.【系统调用接口】系统接口进行文件IO访问
    • 【1】系统调用:open接口介绍与使用演示
    • 【2】系统调用:read接口介绍与使用演示
    • 【3】系统调用:write接口介绍与使用演示

※学习文件IO必须知道的概念

1. 认识 [ 系统调用 ] 和 [ 库函数 ]

  • 在认识返回值之前,先来认识一下两个概念: 系统调用库函数;许多库函数都是封装了系统调用而来
  • 所以,可以认为, f#系列的函数,都是对系统调用的 封装 ,方便二次开发
  1. 库函数(libc):fopen,fclose,fread,fwrite等
  2. 系统调用接口:open,close,read,write,lseek等
    在这里插入图片描述

在这里插入图片描述

2. 区分内核文件结构体file和files_struct&C标准库中文件结构体FILE

  • FILE结构体: C标准库 中定义的一个结构体,用于表示一个打开的文件流,并封装了文件操作的相关信息。
  • file结构体:它代表一个打开的文件,是Linux内核中的结构体
  • 区分: files_struct结构体:是Linux内核中定义的一个结构体,用于表示 进程级别 的文件描述符表,并记录了该进程当前打开的所有文件的信息。

如下图:进程结构体task_struct有一个文件指针指向files_struct结构体,files_struct结构体经过系统调用open后生成file结构体:
在这里插入图片描述

3.延申:思考硬件层面与内核的交互(形成多态)

  • 硬件的读写方式各有不同,通过通过特定的接口和机制(例如遵循特定的声卡驱动架构)与系统I/O进行交互
  • 其中与IO口进行交互的过程中少不了与虚拟文件系统的交互
  • 其中相关的部分也少不了子类继承基类实现 IO传输功能的实现
    在这里插入图片描述

在这里插入图片描述

一.【库函数】回顾c语言中读写文件的方式

库函数有:库函数(libc):fopen,fclose,fread,fwrite等

  • 我们观察如下打开文件的方式,有r,r+,w,w+等等选项
  • 除此之外,c语言还有printf,scanf,fwrite,fprintf,fseek,ftell,rewind等等读写方式
  • 底层其实都是 封装了系统接口 ,我们接下来慢慢说说
FILE *fp = fopen("myfile", "w");//写
FILE *fp = fopen("myfile", "r");//读
  • 打开文件的方式
 r Open text file for reading. 
 The stream is positioned at the beginning of the file.
 
 r+ Open for reading and writing.
 The stream is positioned at the beginning of the file.
 
 w Truncate(缩短) file to zero length or create text file for writing.
 The stream is positioned at the beginning of the file.
 
 w+ Open for reading and writing.The file is created if it does not exist, otherwise it is truncated.
 The stream is positioned at the beginning of the file.
 
 a Open for appending (writing at end of file). The file is created if it does not exist.  The stream is positioned at the end of the file.
 
 a+ Open for reading and appending (writing at end of file).The file is created if it does not exist. The initial file position for reading is at the beginning of the file,  but output is always appended to the end of the file.

二.【系统调用接口】系统接口进行文件IO访问

  • 系统调用接口:open,close,read,write,lseek

【1】系统调用:open接口介绍与使用演示

在这里插入图片描述

  • 查看手册:man open
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
      O_RDONLY: 只读打开
      O_WRONLY: 只写打开
      O_RDWR : 读,写打开
               这三个常量,必须指定一个且只能指定一个
      O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
      O_APPEND: 追加写
      O_TRUNC: 先清空文件内容
 返回值:
      成功:新打开的文件描述符
      失败:-1
 mode_t:
      权限设置
//按照写方式的打开,文件不存在就创建,但会先清空文件内容
    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    
//按照写方式打开,文件不存在就创建,从文件结尾开始写入(追加,不先清空文件内容)
    int fd = open("loga.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);

close(fd);

【2】系统调用:read接口介绍与使用演示

头文件:
#include <unistd.h>  
ssize_t write(int fd, const void *buf, size_t count);
参数:
    fd:文件描述符,是一个非负整数,用于标识要写入数据的文件。
    buf:写入数据的缓冲区的首地址
    count:要写入的数据的字节数。
返回值:
    成功时,返回实际写入的字节数。(这个值可能小于请求的字节数,但绝不会大于请求的字节数)
    失败时,返回-1,并设置errno以指示错误类型。
//打开文件,只写
int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
//参数准备
int count = 5;
const char *msg = "hello bit!\n";
int len = strlen(msg);
//使用
while(count--){
     write(fd, msg, len);
     //fd: 文件描述符, msg:缓冲区首地址, len: 本次读取,期望写入多少个字节的数据。 返回值:实际写了多少字节数据
 }

【3】系统调用:write接口介绍与使用演示

头文件
#include <unistd.h>  
ssize_t read(int fd, void *buf, size_t count);
参数:
    fd:文件描述符,是一个非负整数,用于标识要读取数据的文件。
    buf:指向用户空间中用于存储读取数据的缓冲区的指针。
    count:要读取的数据的字节数。
返回值:
    成功时,返回实际读取的字节数。这个值可能小于请求的字节数,表示已到达文件末尾或发生了其他读取限制。
    失败时,返回-1,并设置errno以指示错误类型。
//打开文件,只读
int fd = open("example.txt", O_RDONLY);  
//参数准备
char buffer[1024];  
ssize_t bytes_read = read(fd, buffer, sizeof(buffer) - 1);  

buffer[bytes_read] = '\0'; // 确保缓冲区以空字符结尾,用于字符串处理  
close(fd);

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

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

相关文章

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…

读数据工程之道:设计和构建健壮的数据系统02数据工程师

1. 背景和技能 1.1. 数据工程是一个快速发展的领域&#xff0c;关于如何成为一名数据工程师仍然存在很多问题 1.2. 进入数据工程领域的人在教育、职业和技能方面有着不同的背景 1.2.1. 每个进入该领域的人都应该投入大量的时间进行自学 1.3. 从一个邻近的领域转到数据工程是…

【STM32开发之寄存器版】(七)-PWM脉冲宽度调制

一、前言 PWM简介 PWM&#xff08;脉宽调制&#xff09;是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号&#xff0c;将其高电平和低电平的持续时间调整&#xff0c;达到控制平均功率的目的。应用方面&#xff0c;PWM广泛用于电机控制、LED…

LeetCode 3310. 移除可疑的方法

LeetCode 3310. 移除可疑的方法 你正在维护一个项目&#xff0c;该项目有 n 个方法&#xff0c;编号从 0 到 n - 1。 给你两个整数 n 和 k&#xff0c;以及一个二维整数数组 invocations&#xff0c;其中 invocations[i] [ai, bi] 表示方法 ai 调用了方法 bi。 已知如果方法 k…

Qt创建插件及使用

本文使用“Qt Creator 6.0.1”和“Qt 6.2.2”完成插件创建及使用&#xff0c;主要有如下步骤&#xff1a;&#xff08;1&#xff09;创建子目录项目MyProject&#xff1b;&#xff08;2&#xff09;在子目录项目中创建应用程序项目MyApp&#xff1b;&#xff08;3&#xff09;在…

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…

Spring Cloud 3.x 集成admin快速入门Demo

1.什么是Spring Boot Admin&#xff1f; Spring Boot Admin(SBA)是一个社区开源项目&#xff0c;用于管理和监视Spring Boot 应用程序&#xff0c;它提供详细的健康(Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存…

Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia

在Steam Deck掌机上运行Windows 11相对轻松&#xff0c;但要让其成功搭载“黑苹果”系统则颇具挑战性。近日&#xff0c;有博主勇于尝试&#xff0c;将macOS 15 Sequoia安装到了Steam Deck上。 开发者kaitlyn在X平台上分享道&#xff1a;“在朋友们的鼎力相助下&#xff0c;我…

【机器学习】KNN算法及鸢尾花案例练习

KNN 算法 knn算法思想 : K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别 常见距…

Mybatis测试案例

1.创建springboot工程 创建实体类user和接口 user类 注意&#xff1a;java和mysql的对象的属性数据类型要一致 mapper接口 2.配置mybatis(连接数据库信息) # spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #地址url spring.datasource.urljdbc:mysql://localho…

虚拟仿真产品图册生成器,上传PDF即可实现

随着科技的飞速发展&#xff0c;我国各行各业对虚拟仿真的需求越来越大&#xff0c;尤其在产品设计、制造、销售等领域&#xff0c;虚拟仿真技术已经成为了企业提高竞争力的重要手段。为了让企业能够更方便、快捷地展示产品&#xff0c;给大家推荐一款创新性的工具——FLBOOK在…

说说BPMN概念及应用

BPMN&#xff08;Business Process Modeling and Notation&#xff09;即业务流程建模与标注&#xff0c;是一种由OMG&#xff08;Object Management Group&#xff0c;对象管理组织&#xff09;制定的业务流程建模语言。以下是对BPMN标准的详细解释&#xff1a; 一、BPMN的起…

Linux操作系统垃圾清理

Linux操作系统虽然是一个占用资源少、结构简洁的计算机系统软件&#xff0c;但长时间频繁使用、安装软件较多后也是会产生不少系统垃圾的。使用Debian系Linux操作系统的用户可以使用麒麟管家中的垃圾清理工具清理&#xff0c;也可以下载安装BleachBit软件进行清理操作。 一、麒…

Studying-多线程学习Part3 - condition_variable与其使用场景、C++11实现跨平台线程池

来源&#xff1a;多线程学习 目录 condition_variable与其使用场景 生产者与消费者模型 C11实现跨平台线程池 condition_variable与其使用场景 生产者与消费者模型 生产者-消费者模式是一种经典的多线程设计模式&#xff0c;用于解决多个线程之间的数据共享和协作问题。…

『网络游戏』动态界面制作创建角色UI【02】

将上一章的登录界面隐藏 创建空物体重命名为CreateWnd 自适应铺满父物体 创建image重命名为bg并铺满 将以下资源图片放进Art文件夹 设置为精灵模式 填充背景 创建介绍Image面板与角色按钮 制作将3D模型动态防止UI界面上 首先创建RawImage 创建RenderTextures文件夹 创建Render…

输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张

输电线路缺陷图像检测数据集&#xff0c;分为导线散股&#xff0c;塔材锈蚀两类&#xff0c;分别为581张和1407张&#xff0c;标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…

红队apt--文本宏病毒攻击思路整理

免责声明:本文仅用于了解攻击方手法&#xff0c;用于提高防范意识。禁止用于非法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理文本类病毒攻击思路 宏简介 这个东西可以直接当做编程理解。用于创建模版(简历模版),定制化需求&#xff0c;自…

【数据管理】DAMA-元数据专题

导读&#xff1a;元数据是关于数据的组织、数据域及其关系的信息&#xff0c;是描述数据的数据。在数据治理中&#xff0c;元数据扮演着至关重要的角色&#xff0c;是数据治理的基础和支撑。以下是对数据治理中元数据专题方案的详细介绍&#xff1a; 目录 一、元数据的重要性 …