当前位置: 首页 > article >正文

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

前言

大家好吖,欢迎来到 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.kler.cn/news/337238.html

相关文章:

  • 电脑端视频通过PCIE到FPGA端转UDP网络视频输出,基于XDMA+PHY芯片架构,提供3套工程源码和技术支持
  • Vue常见问题
  • Python软体中使用NLTK进行文本分析
  • Java面试题——第八篇(JVM)
  • 从 TCP Reno 经 BIC 到 CUBIC
  • CVSS 4.0 学习笔记
  • FPGA远程烧录bit流
  • LiteAIServer最新版本功能免费发布,新支持视频质量诊断、老鼠识别、裸土、固废、扬尘识别
  • 牛羊检测数据集 3700张 牛羊检测平视 带标注 voc yolo 2类
  • YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C2f结构,全网最详细教程
  • 【超详细】基于YOLOv11的PCB缺陷检测
  • 国庆假期结束
  • 详解正则表达式(基本+扩展)
  • 二、图解C#教程
  • Python笔记之识别到当前python脚本所在的目录,而不是执行python命令的目录
  • Vue前端框架的基础配置
  • 各省份自然灾害损失造成的直接经济损失数据(2009-2022年)
  • KDD Cup 2024 Meta LLMs RAG挑战赛冠军方案开源
  • 计算机毕业设计 网上书店系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • css的页面布局属性