【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: 先清空文件内容返回值:成功:新打开的文件描述符失败:-1mode_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.rhkb.cn/news/441128.html

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

相关文章

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳&#xff0c;传输距离有限&#xff0c;缺乏互动等问题。该系统设备使用简便&#xff0c…

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进&#xff01; NLP是人工智能的一个分支&#xff0c;它允许计算机与人类语言进行交互&#xff0c;这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允…

仿RabbitMQ实现消息队列客户端

文章目录 客⼾端模块实现订阅者模块信道管理模块异步⼯作线程实现连接管理模块生产者客户端消费者客户端 客⼾端模块实现 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&#xff0c;弱化了Client客⼾端的概念&#xff0c;也就是说在RabbitMQ中并…

认知战认知作战:激发认知战战术分享热情的秘诀

认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 关键词&#xff1a;认知战, 认知作战, 创造独特体验, 融入社交元素, 情感共鸣策略, 分享激励机制, 战略形象塑造, 个性化内容推荐,认知作战,新质生产力,人类…

E. Tree Pruning Codeforces Round 975 (Div. 2)

原题 E. Tree Pruning 解析 本题题意很简单, 思路也很好想到, 假设我们保留第 x 层的树叶, 那么对于深度大于 x 的所有节点都要被剪掉, 而深度小于 x 的节点, 如果没有子节点深度大于等于 x, 那么也要被删掉 在做这道题的时候, 有关于如何找到一个节点它的子节点能通到哪里,…

用Arduino单片机制作一个简单的音乐播放器

Arduino单片机上有多个数字IO针脚&#xff0c;可以输出数字信号&#xff0c;用于驱动发声器件&#xff0c;从而让它发出想要的声音。蜂鸣器是一种常见的发声器件&#xff0c;通电后可以发出声音。因此&#xff0c;单片机可以通过数字输出控制蜂鸣器发出指定的声音。另外&#x…

马丁代尔药物大典数据库

马丁代尔药物大典是一本由Pharmaceutical Press出版的参考书&#xff0c;拥有全球使用的近 6000 种药物和药品&#xff0c;包括超过 125,000 种专有制剂的详细信息。其中还包括近 700 篇疾病治疗评论。 它于 1883 年首次出版&#xff0c;马丁代尔包含全球临床用药信息&#xff…

【qt】QQ仿真项目2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 一览全局: QQ仿真项目 一.主窗口的创建二.主窗口的ui设计三.初始化状态,等级,app…

<Rust>iced库(0.13.1)学习之部件(三十一):picklist部件的使用及可变style设置

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第三十一篇,主要说明下…

俗人,精气神,歌曲《错的人》

精气神&#xff0c;在人体中&#xff0c;精指构成人体生命活动的各层次的有形元素&#xff0c;常呈固体或液体状态。 哲学前提&#xff1a;世界上的一切&#xff0c;从微观上讲&#xff0c;都是由精微物质构成的&#xff0c;比如基本粒子。 关于有形与无形、与主观关注点相关…

DHCP安装

步骤 1&#xff1a;安装DHCP服务器 在系统上安装DHCP服务。以下是安装命令&#xff1a; # 安装DHCP软件包 yum install dhcp步骤 2&#xff1a;配置DHCP服务器 安装完成后&#xff0c;需要配置DHCP服务器来绑定MAC地址和IP地址。 # 备份原始的DHCP配置文件 cp /etc/dhcp/dh…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…

HCIA综合实验

实验步骤 1.划分网段 内网部分---三个大块 2.先配交换机 左边&#xff1a;3个vlan &#xff0c;3个access&#xff0c;1个trunk 右边&#xff1a;2个vlan &#xff0c;2个access&#xff0c;1个trunk 3.再配路由 3.1 r5先配接口ipg/0/0/0 口配子接口 g0/0/0.1-0.3 g0/0/1 …

【YOLOv8实时产品缺陷检测】

YOLOv8应用于产品缺陷检测实例 项目概况项目实现YOLOv8安装及模型训练关键代码展示动态效果展示 项目概况 本项目是应用YOLOv8框架实现训练自定义模型实现单一零件的缺陷检测&#xff0c;软件界面由PyQt5实现。 功能已正式使用&#xff0c;识别效果达到预期。 项目实现 项目…

手机误删照片?试试这5款免费数据恢复神器!

大家好&#xff01;今天咱们来聊聊一个大家都关心的话题——免费数据恢复工具。不论是误删照片、视频&#xff0c;还是丢失重要文件&#xff0c;数据恢复都是个让人头疼的问题。但好消息是&#xff0c;现在有众多免费的数据恢复工具能帮助我们找回失去的数据。今天我就来为大家…

力扣16~20题

题16&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 双指针法&#xff0c;和15题差不多&#xff0c;就是要排除了&#xff0c;如果total<target则排除了更小的&#xff08;left右移&#xff09;&#xff0c;如果total>target则排除了更大的&#xff08;rig…

pycharm 远程ssh时,mujuco提示mujoco.FatalError: gladLoadGL error

在ubuntu系统运行时完全没问题&#xff0c;但是使用pycharm远程ssh登录时就会提示这个。 解决方法&#xff1a; 1. 可以修改环境变量 2. export LD_PRELOAD/usr/lib/x86_64-linux-gnu/libstdc.so.6 参考【Mujuco】WSL2安装Mujoco用于python,遇到FatalError,以及图形驱动架构…

【Git原理与使用】远程操作标签管理

远程操作&&标签管理 1.理解分布式版本控制系统2.新建远程仓库3.克隆远程仓库4.向远程仓库推送5.拉取远程仓库6.配置 Git7.配置命令别名8.标签管理8.1创建标签8.2操作标签 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496;…