Linux 基础IO
文章目录
- 前言
- 基础IO定义
- 系统IO接口
- 文件描述符
- 重定向原理
- 缓冲区刷新
前言
要知道每个函数/接口的全部参数和返回值建议去官网或者直接在Linux的man手册中查,这不是复制粘贴函数用法的文章。
C语言文件读写介绍链接
基础IO定义
IO是Input/Output的缩写,它是计算机领域中常用的术语,用来描述计算机系统与外部设备之间的数据交换过程。输入(Input)是指将外部数据或指令传输到计算机系统中,而输出(Output)则是指将计算机系统处理后的数据或结果传输到外部设备中。例如,键盘、鼠标、显示器、打印机等都属于外部设备,它们与计算机之间的数据交换过程就是通过输入和输出来实现的。
系统IO接口
在说系统IO接口之前需要区分语言库IO函数和系统IO接口的区别,库函数IO接口如C语言中的fopen函数 fseek函数 ftell函数 rewind函数 等。这些都是语言库对系统IO接口open write read close 等IO接口的再封装。 如图open write read close 等IO接口在用户操作接口层,fopen函数 fseek函数 ftell函数 rewind函数 等在用户层。

文件描述符
文件描述简写为fd;
在Linux中,每个进程都有一个task_struct, task_struct 里有 *files指针, *files指针指向 files_struct结构体(files_struct结构体内含有file_struct结构体的列表的指针) , fd 是 files_struct 内那个指向的数组 的下标,文件描述符本质是文件信息结构体数组下标。(注意files_struct 和 file_struct 差一个字母 )

在调用系统IO接口open打开文件后会返回打开文件描述符。文件描述符是一个非负的整数。在Linux操作系统中的进程中,默认会打开三个文件描述符,分别是0 , 1 , 2 对应三个文件标准输入文件 标准输出文件 标准错误文件 。(Linux中一切皆文件,硬件如:显示器,键盘鼠标接入后都是Linux系统中的一个个文件)
文件描述符的分配原则是,当一个进程打开新的文件,该文件的信息存放在文件信息存储数组中未被使用的且素组下标最小的位置。(也就是说如果默认被标准输入文件使用的0下标在新文件被打开之前就关闭,新文件打开后就会占据0下标来记录新打开文件的文件信息)

重定向原理
重定向原理:关闭文件信息数组newfd下标对应的文件,并将newfd存储的文件设置为oldfd存储的文件信息。此时newfd 和 oldfd 文件描述符实际对应的都是重定向之前 newfd对应的文件信息,即可通过newfd 和 oldfd 文件描述访问同一个文件。
将oldfd实际对应的文件信息给newfd
重定向使用
使用方法一:利用函数
int dup2(int oldfd, int newfd);
参数:
1.oldfd:一个整数值,表示要复制的旧文件描述符。
2.newfd:一个整数值,表示新的文件描述符。
返回值:
如果成功,返回值为newfd;
如果失败,返回值为-1,并设置errno来指示错误类型。
例:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main()
{// 打开一个文件用于写入int fd = open("example.txt", O_WRONLY | O_CREAT, 0644); if (fd == -1) {perror("open");return 1;}// 将标准输出重定向到文件描述符fd所指向的文件int newfd = dup2(fd, STDOUT_FILENO); if (newfd == -1) {perror("dup2");return 1;}printf("This will be written to example.txt\n"); // 这行内容将会写入到example.txt文件中close(fd); // 关闭文件描述符fdclose(newfd); // 关闭新的文件描述符newfdreturn 0;
}
使用方法二:在命令行利用重定向符号 < >
在Linux中,重定向符号>用于将命令的输出结果重定向到指定的文件中。它的作用是将命令的标准输出(stdout)输出到文件中,而不是显示在终端上。
重定向符号>的使用方法是在命令后面加上>符号,紧跟着要输出到的目标文件名。例如:
command > filename
command表示要执行的命令,filename表示要将输出结果写入的目标文件名。
当执行带有重定向符号>的命令时,如果目标文件已经存在,则会被覆盖;如果目标文件不存在,则会创建一个新文件。重定向符号>会将命令的标准输出重定向到目标文件中,不会在终端上显示输出结果。以下是几个示例,演示如何使用重定向符号>进行输出重定向:
- 将ls命令的输出结果写入到名为file.txt的文件中:
ls > file.txt
- 将command命令的错误输出(标准错误流)写入到名为error.txt的文件中
command 2> error.txt
缓冲区刷新
什么是缓冲区
缓冲区区分
前面IO分为系统IO和语言库封装的IO函数,语言库在封装IO接口的同时也对IO缓冲区刷新策略做了封装,C语言的缓冲刷新策略和Linux本身缓冲区刷新策略大致一样。但C语言的函数在系统缓冲区的基础上,在语言库层面(用户层)再设置了一个缓冲区,该缓冲区具体在FILE结构体中。
Linux 缓冲区刷新策略:
-
全缓冲(fully buffered):默认情况下,Linux使用全缓冲模式。在全缓冲模式下,数据会在缓冲区中累积一定量后才会被写入磁盘,这样可以减少磁盘I/O操作的次数,提高性能。但是,这也意味着数据可能会在缓冲区中停留一段时间,直到缓冲区满或者手动刷新。
-
行缓冲(line buffered):对于某些特殊的文件,如终端设备,Linux会使用行缓冲模式。在行缓冲模式下,数据会在遇到换行符时立即写入磁盘,这样可以保证及时显示输出结果。但是,对于普通文件,行缓冲模式并不常见。
-
无缓冲(unbuffered):在某些情况下,我们可能需要禁用缓冲区,直接将数据写入磁盘。这种模式下,数据会立即写入磁盘,但是由于没有缓冲区,会导致频繁的磁盘I/O操作,性能较差。
库函数刷新策略证明
#include <stdio.h>
#include <string.h>
int main()
{const char *msg0="hello printf\n";const char *msg1="hello fwrite\n";const char *msg2="hello write\n";printf("%s", msg0);fwrite(msg1, strlen(msg0), 1, stdout);write(1, msg2, strlen(msg2));fork();return 0;
}
直接运行结果:
hello printf
hello fwrite
hello write
./test > file 重定向之后结果:
hello write
hello printf
hello fwrite
hello printf
hello fwrite
现象解释:C语言库函数缓冲区在输入对象为终端时刷新策略为行缓冲,直接运行时,在遇到换行符时就将库函数缓冲区的内容刷新到系统缓冲区,再由系统缓冲区输入到终端上。重定向后,输入目标为普通文件,刷新策略变为全缓冲,write输入到系统缓冲区,fwrite 和 printf 属于C语言库函数,输入了C语言库函数缓冲区,在子进程创建后,会拷贝一份C语言库函数缓冲区 (因为拷贝了FILE结构体,C语言库函数缓冲区即为FILE结构体的成员) 到子进程。 进程结束时会将父子进程C语言库函数的缓冲区的内容输入系统缓冲区,再由系统缓冲区一起刷新到终端(屏幕)。
相关文章:
Linux 基础IO
文章目录 前言基础IO定义系统IO接口文件描述符重定向原理缓冲区刷新 前言 要知道每个函数/接口的全部参数和返回值建议去官网或者直接在Linux的man手册中查,这不是复制粘贴函数用法的文章。 C语言文件读写介绍链接 基础IO定义 IO是Input/Output的缩写,…...
uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件
H5跟安卓APP 手机打开的效果图: Vue页面: <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…...
掌控安全 -- header注入
http header注入 该注入是指利用后端验证客户端口信息(比如常用的cookie验证)或者通过http header中获取客户端的一些信息(比如useragent用户代理等其他http header字段信息),因为这些信息是会重新返回拼接到后台中的&…...
windows批处理脚本(.bat)如何激活Anconda Prompt虚拟环境
通过call 来调用激活脚本, activate myenv指的是要激活的环境,若省略,则激活的是base环境。 call : 从另一个批处理程序调用一个批处理程序,而不停止父批处理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…...
扩散模型实战(十四):扩散模型生成音频
推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四ÿ…...
《微信小程序开发从入门到实战》学习四十七
4.4 云函数 4.4.5 云函数的定时触发 如果云函数需要定时执行,可以使用云函数定时触发器。配置了定时触发器,云函数会在相应时间点被自动触发。函数返回结果不会返回调用方 在需要添加触发器的云函数下新建文件config.json。格式如下: &quo…...
LeetCode刷题笔记之数组
一、二分查找 1. 704【二分查找】 题目: 给定一个 n 个元素 有序的(升序) 整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。代码:…...
ViT:视觉 Transformer
ViT:视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势:注意力机制相当于一个多标签检索系统,位置嵌入能知道每个单词的位置,而且适合并行。 尝试把 Transformer 迁移到视觉领…...
Jmeter 请求签名api接口-BeanShell
Jmeter 请求签名api接口-BeanShell 项目签名说明编译扩展jar包jmeter 使用 BeanShell 调用jar包中的签名方法 项目签名说明 有签名算法的api接口本地不好测试,使用BeanShell 扩展jar 包对参数进行签名,接口签名算法使用 sha512Hex 算法。签名的说明如下…...
No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)
有两种情况: 压根没安装下载了但没设为库或方法不对 大多数为第一种情况: 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…...
word文档中数字格式转换(排版助手)
示例:李老师收入了234243.33元,产量3000公斤; 张老师收入了2324324元,产量45555公斤; 孙老师收入了600000元,产量2342公斤 王老师收入了1234443243元,产量1243142公斤。 1、数字批量转换成千…...
阿里云docker加速
文章目录 一、 阿里云镜像仓库配置二、配置加速1. CentOS2. Mac3. Windows注意 一、 阿里云镜像仓库配置 1.注册阿里云账号,并登陆到阿里云后台,进入控制台面板 2.进入控制台以后,找到左上方的三横的功能列表按钮,在弹出来的功能…...
Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现
0x01 产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中,针对网络流量的信息进行日志留存,可对用户上网行为进行审计,逐渐形成大数据采集、 大数据分析、 大数据整合的工作模式…...
openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复
文章目录 openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复152.1 背景信息152.2 前提条件152.3 PITR恢复流程152.4 recovery.conf文件配置**152.4.1 归档恢复配置****152.4.2 恢复目标设置** openGauss学习笔记-152 openGauss 数据库运维-备份…...
PhpStorm基本配置及常用快捷键
重要Preference配置 激活服务器 http://jetbrains.tencent.click/http://owo.helphttp://idea.imsxm.com/http://www.0-php.com:10172017.3以上版本 JetBrains IDE 2017.3以上版本,激活检测机制变成了动态封禁域名,导致大部分域名激活被屏蔽了࿰…...
Autosar通信实战系列05-CanNM模块进阶常见问题思考
本文框架 前言1. UDS 0x28服务控制Nm报文收发后对状态机有影响?2. 节点网络启动后第一帧是否必须是网络管理报文?3. 主动唤醒后发送的第一帧报文为NM报文如何配置?4. CanNmMsgCycleOffset的使用场景?5. 什么情况下CBV中RepeatMessageRequest Bit置位?6. 主动(本地)唤醒与…...
Java中多态的一些简单理解
什么是多态 1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发…...
011 数据结构_哈希
前言 本文将会向你介绍哈希概念,哈希方法,如何解决哈希冲突,以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经…...
案例025:基于微信小程序的移动学习平台的设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
写实3D游戏模型纹理贴图设置
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格: …...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
