[Linux系统编程]文件IO

一.系统调用

什么是系统调用?
只有系统调用(系统函数)才能进入内核空间,库函数也是调用系统函数,才得以访问底层。
系统调用由操作系统实现并提供给外部应用程序的编程接口。是应用程序同系统之间数据交互的桥梁。
换句话说,系统调用就是操作系统封装好的函数接口,使得用户能够利用它调用底层驱动,从而控制硬件。
在这里插入图片描述
二.open函数,read函数,write函数
1.open
所需头文件:

#include<fcntl.h>
#include<unistd.h>

open函数用来打开文件,具体有以下两种重载类型。
正常打开返回一个int整数(文件描述符),打开出错返回-1

在这里插入图片描述
path : 路径名 flags: 打开方式 mode:生成文件时的权限(4位8进制数)
第一种是文件存在时,指定打开方式
第二种是文件不存在,且要求创建文件时,按mode指定权限

flags分为以下几种:

O_RDONLY :只读
O_WRONLY:只写
O_RDWR:读写
O _APPEND:追加写
O_CREAT:无文件时创建
O_EXCL:是否存在
O_TRUNC:文件清空再打开
O_NONBLOCK:以非阻塞方式打开(使用在设备,网络文件下)
#include<fcntl.h> 这些包含在头文件<fcntl.h>中,所以需要引入#include<fcntl.h>

使用close(文件描述符) ----------关闭流

2.read
read函数返回读入的字节数,读出错误返回-1
read(文件描述符,字符串缓冲区,读出字节数)
在这里插入图片描述
3.write
write函数将缓冲区内容读入文件,返回写入的字节数,写入失败返回-1
write(文件描述符,字符串缓冲区,写入字节数)
在这里插入图片描述

4.案例:使用read write实现cp操作
cp 文件1 文件2
对main函数传递两个参数,代表文件名
文件一,使用只读打开方式
文件二,无文件时创建文件。
使用buffer缓冲区(1024字节),循环输入文件,当read函数读入字符数为空时,read函数返回0,此时退出循环。在这里插入图片描述

二.预读入缓输出

库函数和系统调用执行的速度,一定是系统调用速度更快吗?
答案是不一定,如fputc库函数与write/read 系统函数,若将缓冲区buffer设置为1,使它们每次都读入一个字节,谁的速度更快?
首先明确,由于向磁盘写入数据较慢,在内核区中会设置一个缓冲区,直到缓冲区有足够数据时再一次性写入磁盘。在用户区中,也会有一个缓冲区,它存在的目的是希望数据暂时读入到缓冲区里,然后再一次性输入到内核区的缓冲区里。这是因为从用户区到内核区是需要时间开销的,通过预读入就可以避免多次用户/内核区之间的跳转。
所以,若设置系统调用write/read的自定义缓冲区为1个字节,那么每读入一个字节,就要执行一次从用户区到内核区的跳转,时间开销大。
但是库函数fputc开的缓冲区较大(默认4096字节),先在用户区中预读入,然后再一次性执行系统调用,就避免了大量的时间开销,所以,虽然每次都是读入一个字节,底层实现原理是预读入缓输出,这跟开的缓冲区大小有关。

在这里插入图片描述

三.文件描述符

一个进程在内存中有自己的内存地址空间,其中,PCB(进程控制块)被存放在内存中,用来管理该进程,PCB本质上是一种数据结构,维护着进程的一些信息,其中就包含了文件描述符表。
PCB维护了一个指向该表的指针,通过这个指针可以访问到文件描述符表,文件描述表中的每一个节点,都保存了一个指针,指向某个文件结构体。我们上文所说的文件描述符,实际上是它的下标

默认最大保存文件数:1024
一个进程中运行时会有0:标准输入文件 1:标准输出文件 2:标准错误文件 ,这也解释了为什么open一个文件时,会从3号开始返回。
0:STDIN_FILENO
1:STDOUT_FILENO
2:STDERR_FILENO

三.文件描述符

四.阻塞和非阻塞

常规文件不会产生阻塞等待,只有在打开设备文件,网络文件时才会产生阻塞。
例如标准输入文件STDIN_FILENO
默认打开设备/网络文件是以阻塞方式打开的,可以在open时使用O_NONBLOCK以非阻塞方式打开。
当文件再以非阻塞方式打开式,且无数据输入,read返回-1,且errno = EAGAIN 或者EWOULDBLOCK,此时并不是说读文件错误,而是说明文件可打开,但是没有数据输入。
如下,处理标准输入
在这里插入图片描述

在这里插入图片描述

五.fcntl函数修改文件访问属性
fcntl可以不重新打开,就可以修改文件访问属性
获取当前访问属性: fcntl(“文件描述符”,F_GETFL),返回一个int类型,是一个位图,表示当前访问属性
对于该返回值,设其为flgs, 可以通过 | 为其添加属性---------- flgs |= O_XXXXX
设置属性:fcntl(“文件描述符”,F_SETFL,flgs) ,

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov5-ros模型结合zed2相机部署在 Ubuntu系统

前言 本篇文章主要讲解yolov5-ros模型结合zed2相机进行实时检测&#xff0c;经改进实现了红绿灯检测&#xff0c;并输出检测类别与置信度&#xff01; 目录 一、环境配置二、zed2驱动安装三、yolov5-ros功能包配置四、运行官方权重文件四、运行自己权重文件 一、环境配置 1、…

14-alert\confirm\prompt\自定义弹窗

一、认识alert\confirm\prompt 下图依次是alert、confirm、prompt&#xff0c;先认清楚长什么样子&#xff0c;以后遇到了就知道如何操作了。 二、alert操作 先用driver.switch_to.alert方法切换到alert弹出框上&#xff1b;可以用text方法获取弹出的文本信息&#xff1b;acce…

【介绍下运维,什么是运维?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

C++ | Leetcode C++题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; class Solution { public:int minimumTotal(vector<vector<int>>& triangle) {int n triangle.size();vector<int> f(n);f[0] triangle[0][0];for (int i 1; i < n; i) {f[i] f[i - 1] triangle[i][i];for (…

RK3588+FPGA+AI高性能边缘计算盒子,应用于视频分析、图像视觉等

搭载RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主频高达 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更强的 CPU运算能力&#xff0c;具备6T AI算力&#xff0c;可扩展至38T算力。 产品规格 系统主控CPURK3588&#xff0c;四核…

【QEMU中文文档】1.1 支持的构建平台

本文由 AI 翻译&#xff08;ChatGPT-4&#xff09;完成&#xff0c;并由作者进行人工校对。如有任何问题或建议&#xff0c;欢迎联系我。联系方式&#xff1a;jelin-shoutlook.com。 原文&#xff1a;Supported build platforms — QEMU documentation QEMU 旨在支持在多个主机…

Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)

一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…

Dynamics 365:安全的客户参与应用程序

客户参与应用程序使用Microsoft Dataverse提供了一个丰富的安全模型&#xff0c;可以适应许多业务场景。本节为您提供了应考虑的安全措施的特定于产品的指导。 Dataverse安全模型有以下目标&#xff1a; 只允许用户访问他们工作所需的信息。按角色对用户进行分组&#xff0c;并…

Sping源码(九)—— Bean的初始化(非懒加载)— FactoryBean

FactoryBean 先来介绍一下FactoryBean是什么。以及BeanFactory和FactoryBean的区别。 举个栗子&#xff1a; MyFactoryBean.class public class MyFactoryBean implements FactoryBean<User> {Overridepublic User getObject() throws Exception {return new User(&qu…

CAPL如何发送一条UDP报文

UDP作为传输层协议,本身并不具有可靠性传输特点,所以不需要建立连接通道,可以直接发送数据。当然,前提是需要知道对方的通信端点,也就是IP地址和端口号。 端口号是传输层协议中最显著的特征,传输层根据它来确定上层绑定的应用程序,以达到把数据交给上层应用处理的目的。…

五种主流数据库:常用数据类型

在设计数据库的表结构时&#xff0c;我们需要明确表中包含哪些字段以及字段的数据类型。字段的数据类型定义了该字段能够存储的数据种类以及支持的操作。 本文将会介绍五种主流数据库中常用的数据类型以及如何选择合适的数据类型&#xff0c;包括 MySQL、Oracle、SQL Server、…

基于Springboot + vue实现的文化民俗网站

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了&#xff0c;简单且好用。为了让其更好用&#xff0c;同时支持拦截器&#xff0c;支持Promise 写法&#xff0c;特对其进行封装。同时支持H5和小程序环境&#xff0c;更好用啦。文中给出使用示例&#xff0c;可以看到使用变得如此…

安卓Zygote进程详解

目录 一、概述二、Zygote如何被启动的&#xff1f;2.1 init.zygote64_32.rc2.2 Zygote进程在什么时候会被重启2.3 Zygote 启动后做了什么2.4 Zygote启动相关主要函数 三、Zygote进程启动源码分析3.1 Nativate-C世界的Zygote启动要代码调用流程3.1.1 [app_main.cpp] main()3.1.2…

11- Redis 中的 SDS 数据结构

字符串在 Redis 中是很常用的&#xff0c;键值对中的键是字符串类型&#xff0c;值有时也是字符串类型。 Redis 是用 C 语言实现的&#xff0c;但是它没有直接使用 C 语言的 char* 字符数组来实现字符串&#xff0c;而是自己封装了一个名为简单动态字符串&#xff08;simple d…

13.优化界面化的游戏辅助

12.使用mfc实现游戏辅助的界面 在它的代码上进行修改 12.使用mfc实现游戏辅助的界面它的代码是频繁读写游戏的内存&#xff0c;这样不是很好&#xff0c;下面的代码是在它的基础上进行了封装&#xff0c;控制无敌的逻辑在我们申请的内存中实现&#xff08;也就是在一个全局中实…

gcc 内建函数示例 __builtin_return_address

1,理论未动&#xff0c;示例先行 hello_gcc_callstack.c #include <stdio.h>void do_backtrace() {void *pc0 __builtin_return_address(0);void *pc1 __builtin_return_address(1);void *pc2 __builtin_return_address(2);void *pc3 __builtin_return_address(3);…

oracle中的INTERVAL函数学习总结

Oracle 从9i数据库开始引入了一种新特性&#xff0c;可以用来存储时间间隔&#xff0c;出现了INTERVAL 函数。这个函数的表达式比较多&#xff0c;初学比较费劲不好掌握&#xff0c;经过以几个小时的查阅资料和实验&#xff0c;总结如下&#xff1a; interval year t…

使用Redis常遇到的问题

文章目录 概述缓存雪崩、穿透、击穿大key问题热Key问题缓存和数据库双写一致性问题缓存并发竞争Redis线上阻塞要如何排查Redis 常见的性能问题都有哪些Redis 如何做内存优化Redis数据倾斜 概述 在使用Redis时&#xff0c;有几个常见的问题可能会出现&#xff0c;包括但不限于以…

2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第三阶段任务书

第三阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第三阶段试题。根据信息安全管理与评估项目技术文件要求&#xff0c;第三阶段为夺旗挑战CTF&#xff08;网络安全渗透&#xff09;。 本次比赛时间为180分钟。 介绍 夺旗挑战赛&#xff08;CTF&#xff09;的目标…