缓冲区和文件IO--linux系统调用

news2024/11/25 4:29:36

缓冲区

  • 缓冲区是一块内存区域,用于存储数据,直到数据被真正写入到文件或设备中,或从文件或设备中读取。
  • 这种机制使得程序可以一次处理较大的数据块,而不是频繁地进行较小的I/O操作。

缓冲模式

  • 全缓冲:数据会被先写入缓冲区,直到缓冲区满了才会实际写入到文件中。这种模式通常用于文件。
  • 行缓冲:数据会在遇到换行符时被写入到文件中。行缓冲通常用于终端设备。
  • 无缓冲:数据每次调用readwrite时都会直接进行操作,没有缓冲区。这种模式适用于需要实时数据处理的设备。

 

标准IO函数

  • fopen(), fread(), fwrite(), fclose():用于打开文件、读取数据、写入数据和关闭文件。
  • fflush():用于强制将缓冲区的数据写入到文件中。这在需要确保数据被写入时特别有

缓冲区刷新时机

  • 自动刷新:当缓冲区满了、遇到换行符(对于行缓冲模式)或关闭文件时,标准IO库会自动刷新缓冲区。
  • 显式刷新:通过调用fflush()函数,程序可以显式地刷新指定流的缓冲区。

 标准IO和系统调用的区别

  • 标准I/O(stdio

    • 接口:提供了更高层次的文件操作接口,如fopen(), fread(), fwrite(), fclose()等。
    • 缓冲:标准I/O库使用缓冲区来提高I/O效率。例如,fread()fwrite()操作会在缓冲区中进行,只有在缓冲区满了或流被关闭时才会实际读写数据。
    • 便捷性:提供了文件流的抽象,便于进行格式化输入输出(如fprintf()fscanf()),并处理文件位置指针等。
  • 系统调用

    • 接口:提供了底层的文件操作接口,如open(), read(), write(), close()等。
    • 无缓冲:系统调用直接与操作系统交互,没有标准I/O库中的缓冲机制。每次read()write()调用都直接操作文件描述符。
    • 控制:允许更细粒度的控制和操作,比如文件的权限设置、文件描述符的操作等。

系统调用列表

  • open():打开一个文件或设备,返回一个文件描述符。可以设置文件打开模式和权限。
  • read():从文件描述符中读取数据。需要指定要读取的字节数。
  • write():向文件描述符中写入数据。需要指定要写入的数据和字节数。
  • close():关闭一个文件描述符,释放相关资源。
  • lseek():改变文件描述符的文件偏移量,支持随机访问。

 

特点

  • 直接操作:系统调用提供直接的文件描述符操作,不经过标准I/O库的缓冲区机制,通常用于需要更高性能或特殊控制的场景。
  • 文件描述符:每个打开的文件、设备或管道都有一个唯一的文件描述符(整数)。这些文件描述符是系统调用操作的基础。
  • 底层控制:系统调用允许进行底层操作,比如设置文件状态标志(如O_NONBLOCK)、文件锁等。
  • 无缓冲:每次read()write()操作都直接访问内核和文件系统,这意味着可以精确控制I/O操作,但也可能需要更多的处理来管理数据的读写。
  • 性能:由于系统调用直接操作底层文件描述符,通常可以获得更高的性能,但编程时需要管理更多的细节。

Linux系统调用中常用文件I/O函数的详细讲解:

1. open()

作用:打开一个文件或设备,并返回一个文件描述符,用于后续的读写操作。

 原型

int open(const char *pathname, int flags, mode_t mode);
  • pathname:要打开的文件或设备的路径。
  • flags:指定打开文件的模式(如只读、只写、读写等)。常见标志包括:
    • O_RDONLY:只读模式
    • O_WRONLY:只写模式
    • O_RDWR:读写模式
    • O_CREAT:如果文件不存在,则创建新文件
    • O_TRUNC:如果文件存在,则截断文件长度为0
    • O_APPEND:每次写入时,追加到文件末尾
  • mode(可选):文件权限模式,仅在O_CREAT标志被使用时需要。常用的权限模式包括:
    • S_IRUSR:所有者可读
    • S_IWUSR:所有者可写
    • S_IXUSR:所有者可执行
    • S_IRGRP:组用户可读
    • S_IWGRP:组用户可写
  • 成功时,返回一个非负整数,作为文件描述符。
  • 失败时,返回-1,并设置errno以指示错误原因。

 

2. read()

作用:从文件描述符中读取数据。

原型

ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符,表示打开的文件或设备。
  • buf:指向存储读取数据的缓冲区的指针。
  • count:要读取的字节数。

返回值

  • 成功时,返回实际读取的字节数。如果文件末尾被达到了,返回0
  • 失败时,返回-1,并设置errno以指示错误原因。

3. write()

作用:向文件描述符中写入数据。

原型

ssize_t write(int fd, const void *buf, size_t count);

 

  • fd:文件描述符,表示打开的文件或设备。
  • buf:指向要写入数据的缓冲区的指针。
  • count:要写入的字节数。

返回值

  • 成功时,返回实际写入的字节数。
  • 失败时,返回-1,并设置errno以指示错误原因。

4. close()

作用:关闭一个文件描述符,释放相关资源。

原型

int close(int fd);

 

  • fd:要关闭的文件描述符。

返回值

  • 成功时,返回0
  • 失败时,返回-1,并设置errno以指示错误原因。

 

5. lseek()

作用:改变文件描述符的文件偏移量,支持随机访问。

原型

off_t lseek(int fd, off_t offset, int whence);
  • fd:文件描述符。
  • offset:相对于whence的位置的偏移量。
  • whence:指定偏移量的基准点,常用值包括:
    • SEEK_SET:从文件开始处
    • SEEK_CUR:从当前位置
    • SEEK_END:从文件末尾

返回值

  • 成功时,返回新的文件偏移量。
  • 失败时,返回-1,并设置errno以指示错误原因。

笔记详解 

bbd367ea1db84cdfbc56a7f34f287f5f.jpg

d9389a9030b44e83a975ba856ce2dc8e.jpg 

 471e8353715e44c7bace5eb9bd143b43.jpg

1d1a6935c7154edd9e9e380446ae8b1c.jpg 

b7bfa6cb30e04cfa85843e9ab1d7be9c.jpg 

 

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

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

相关文章

学习LLM大模型,不容错过的《大语言模型:基础与前沿》(附PDF下载)

前言 就目前来看,大量工作正逐渐被大型语言模型(LLM)所替代,就比如文本自动生成、智能客服、数据分析和预测等多个领域。这暗示着LLM正逐步成为支撑社会运作的关键基础设施。未来,比Devin更为智能的LLM将会问世。我们…

ARMxy 智能控制器:工业自动化的创新解决方案

工业自动化对控制器的要求也越来越高。ARMxy 智能控制器集成了 PLC 控制和 4G 边缘计算网关,具有多合一的功能,为工业自动化提供了创新的解决方案。 ARMxy 智能控制器的 PLC 控制功能使其能够实现对工业生产过程的精确控制。它可以接收各种传感器的信号…

mapbox-gl 实现绘制图形吸附功能

文章目录 一、前言二、实现代码 一、前言 mapbox-gl 为地图前端框架,以优美的地图样式著称。mapbox-gl-draw 插件可以实现绘制图形,编辑图形的功能,但是编辑图形时无法吸附点位,导致相邻面无法相接。使用mapbox-gl-draw-snap-mod…

JS+CSS案例:用CSS+JS做漂亮的拟真时钟

JSCSS案例:用CSSJS做漂亮的拟真时钟 今天给大家分享一个挺酷的CSSjs模拟的时钟。 案例效果图: 案例分析 通过CSS画一个表的外观,通过JS获取当前时间,并控制表针做对应角度的旋转。 制作时钟外观 HTML结构 首先,我…

python实现小游戏随机猜数

1、脚本练习 import random# 初始化剩余的猜测次数 counts 3 # 生成一个1到10之间的随机整数 numb random.randint(1, 10)# 循环直到猜测次数用完 while counts > 0:tmp input("请输入小鱼手里的数字 (你还剩下 {} 次机会): ".format(counts))guess int(tmp)…

精通剪辑艺术,2024年度四大必备剪辑软件推荐!

在这个视觉为王的时代,视频内容的创作和编辑已经成为了一种艺术形式。无论是个人创作者还是专业团队,都在寻找能够提升工作效率和创作质量的工具。今天,就让我们一起探索几款市面上广受好评的视频剪辑工具,它们将帮助你将创意变为…

测试总结8/6

1.签到 判断其大小写是否与之相等 #include<bits/stdc.h> using namespace std; long long t,x,y; int ans,n,m,k0; const int N2e57; int s[N]; string sum; string num"CodeForces"; int main() {cin>>n;for(int i1; i<n; i) {cin>>sum;int …

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…

当上领导,不可不懂的3大管人法则

当上领导&#xff0c;不可不懂的3大管人法则&#xff0c;精辟&#xff01; 法则一&#xff1a;软硬都要 在团队管理中&#xff0c;只硬不软或只软不硬都无法达到理想的效果。 只有软硬兼施&#xff0c;刚柔并济&#xff0c;才能四两拨千斤&#xff0c;根据不同的情况和员工&a…

深入解析数据仓库ADS层-从理论到实践的全面指南

在大数据时代,数据仓库已经成为企业进行数据分析和决策的核心系统。而在数据仓库的分层架构中,ADS(Application Data Store)层作为最上层的数据应用层,直接面向业务应用和分析需求,其重要性不言而喻。然而,很多数据从业者对ADS层的理解还停留在表面,不清楚如何构建高效的ADS层来…

2024年全国青少信息素养大赛python编程复赛集训第十一天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

归并排序+堆,P1631 序列合并

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 序列合并 - 洛谷 二、解题报告 1、思路分析 不难想到 a[0] b[0] < a[0] b[1] < a[0] b[2] < ... < a[0] b[n - 1] a[1] b[0] < a[1] b[1] < a[1] b[2] < ... < a[1] b[n…

如何拯救LoRA初始化?LoRA-GA:性能显著提升+收敛速度更快!

文章链接&#xff1a;https://arxiv.org/pdf/2407.05000 亮点直击 提出了 LoRA-GA&#xff0c;一种新颖的 LoRA 初始化方法&#xff0c;通过近似低秩矩阵的梯度与全权重矩阵的梯度来加速收敛。确定了在非零初始化下的缩放因子&#xff0c;该因子确保适配器输出的方差不受适配器…

PCIe学习笔记(17)

延迟容忍报告(LTR)消息 LTR消息可选地用于报告有关其读/写服务延迟容忍度的设备行为。 &#xff08;通过 LTR&#xff0c;PCIe 设备可以告知系统它们能容忍的最大响应延迟是多少&#xff0c;只要系统在这个时间之内对 PCIe 设备提出的请求做出响应即可。&#xff09; LTR消息…

统信UOS微信常见问题

统信UOS微信常见问题 1. 家庭版如何激活&#xff1f; ①注册Union ID账号 ②绑定微信 ③登录Union ID激活系统 2. 应用商店微信qq下载失败&#xff0c;进行系统更新&#xff0c;提示依赖错误&#xff0c;检查更新失败怎么解决&#xff1f; 问题描述 安装应用商店内的应用无法…

【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

目录 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09;二、不可中断的睡眠状态&#xff08;D深度睡眠状态&#xff09;三、关于S浅度睡眠状态与D深度睡眠状态的理解 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09; S&#xff08;sleeping&#xff09;…

利用阿里云镜像仓库创建属于自己的私有镜像仓库

阿里云官网&#xff1a;https://www.aliyun.com/ 在阿里云官网注册账号&#xff0c;然后进入控制台 选择容器镜像服务 创建命名空间 创建镜像仓库 选择命名空间&#xff0c;仓库类型&#xff08;设为私有的话&#xff0c;镜像不能随意拉取&#xff09; 点管理 按以下步骤将…

炒黑豆:营养与美味的黑色宝藏

在众多的美食中&#xff0c;炒黑豆宛如一颗低调的黑色珍珠&#xff0c;散发着独特的魅力。食家巷炒黑豆&#xff0c;看似简单&#xff0c;却蕴含着不简单的营养价值。黑豆本身富含蛋白质、维生素、矿物质等多种营养成分&#xff0c;经过炒制之后&#xff0c;其香味被进一步激发…

(javaweb)Http协议

目录 一.http概述 二.Http-请求协议 三.Http响应协议 四.Http协议解析 一.http概述 ---复制这个位置会自动前面有http 浏览器给服务器发送请求携带请求数据&#xff0c;服务器解析数据&#xff0c;服务器前提需要知道具体格式等等--约定 服务器处理完请求&#xff0c;需要给…

jpg图片怎么批量转为png?jpg图片批量转为png的几种方法

jpg图片怎么批量转为png&#xff1f;在处理大批量的jpg图片&#xff0c;并将它们转换为png格式时&#xff0c;选择合适的工具和策略至关重要。这种转换通常涉及到不同的应用场景和需求&#xff0c;例如在网页设计中需要透明背景&#xff0c;或者在打印工作中需要更高的图像质量…