Linux高级编程 8.13 文件IO
一、文件IO
操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用(unistd.h) 其中有个 文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。
这是一个基于Linux内核的没有缓存的IO机制
文件IO特性:
.1 没有缓冲区
.2 操作对象不在是流,而是文件描述符
.3文件描述符
很小的非负的整数 int 0-1023
内核每打开一个文件就会获得一个文件描述符
每个程序在启动的时候操作系统默认为其打开
三个描述符与流对象匹配:
0 ==>STDIN_FILENO === stdin
1 ==>STDOUT_FILENO == stdout
2 ==>STDERR_FILENO == stderr
stdin,stdout,stderr,===>FILE*(标准IO)
注意:由于0,1,2被这三个描述符占了,所以我们写的文件描述符一般从3开始。
比较标准IO:
.1标准IO是C库中的,C库相比于系统调用,具有可移植性,也就是可以跨平台
.2标准IO提供了缓冲机制,例如全缓冲、行缓冲和无缓冲。
.3标准IO所使用函数,如fopen,fgets,fclose等,文件IO使用open,read,write,close等
.4标准 I/O 主要处理与标准输入、输出和标准错误相关的流。文件 I/O 可以处理各种文件,包括普通文件、设备文件等。
二、相关函数
1.open
int open(const char *pathname, int flags,int mode);
功能:获得一个文件描述符
参数:
pathname:文件名
flags:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 创建文件
O_TRUNC 文件内容清空
O_APPEND 追加
fopen与open对比
w O_WRONLY|O_CREAT|O_TRUNC
w+ O_RDWR|O_CREAT|O_TRUNC
r O_RDONLY
r+ O_RDWR
a O_WRONLY|O_CREAT|O_APPEND
a+ O_RDWR|O_CREAT|O_APPEND
返回值:
成功返回文件描述符
失败返回-1
eg:open("1.c",O_WRONLY|O_CREAT|O_TRUNC,0666 );
最后的0666是权限,与O_CREAT相对应,有创建就需要设置权限
注意:0666的前导零是不能省略的,这标志着0666是八进制,同时在创建目录和文件时,系统会与默认的umask(0002)相减,以便控制新建目标和文件有合理的权限。一般新建文件设置权限为0666,新建目录设置权限为0777;由于与umask相减,所以查看时,文件的权限会变成664(rw-rw-r--),目录权限会变成775(rwx rwx r-x)
2.write
ssize_t write(int fd, const void *buf, size_t count);
功能:通过文件描述符向文件中写一串数据
参数:
fd:文件描述符
buf:要写入文件的字符串的首地址
count:要写入字符串的实际长度
eg:
char buf[512]="hello";
write(fd,buf,strlen(buf));
注意:在write函数中count应该写buf里的字符串实际有效长度,这里使用了strlen计算字符串的长度,不能用sizeof(buf),因为sizeof计算出来的是所占空间的大小,是512字节,但是hello只有5字节,剩下的五百多字节就会补'\0',但文本文件中是不能有'\0'的。
返回值:
成功返回实际写入的个数
失败返回-1
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>int main(int argc, const char *argv[])
{int fd=open("open.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);if(fd==-1){fprintf(stderr,"open error\n");return 1;}printf("fd is %d\n",fd);//打印文件描述符char buf[512]="bullish of shit";int ret=write(fd,buf,strlen(buf));if(ret==-1){fprintf(stderr,"write error\n");return 1;}close(fd);return 0;
}
3.read
ssize_t read(int fd, void *buf, size_t count);
功能:通过文件描述符读取文件中的数据
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:要读到数据的个数
注意:在read函数中count的值可以比实际的有效长度长,可以使用sizeof(buf)。
返回值:
成功返回读到数据的个数
失败返回-1
读到文件结尾返回0
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, const char *argv[])
{int fd=open("open.txt",O_RDONLY);if(fd==-1){fprintf(stderr,"open error\n");return 1;}printf("fd is %d\n",fd);char buf[512]={0};while(1){int ret=read(fd,buf,sizeof(buf));if(ret<=0){break;}printf("%s\n",buf);}close(fd);return 0;
}
4.lseek
off_t lseek(int fd, off_t offset, int whence);
功能:定位光标的位置
参数:
fd:文件描述符
offset:偏移量
正:向后偏移
负:向前偏移
零:不偏移
whence:
SEEK_SET
SEEK_CUR
SEEK_END
返回值:
成功返回偏移量,从文件开头开始,以字节为单位测量?
失败返回-1
通过lseek可以求文件大小
off_t off=lseek(fd,0,SEEK_END);
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{int fd = open("backup.c",O_RDWR); if(-1 == fd){fprintf(stderr,"open error\n");return 1;}off_t off = lseek(fd,15,SEEK_SET);printf("off %ld\n",off);char buf[]="hello";write(fd,buf,strlen(buf));printf("fd is %d\n",fd);close(fd);return 0;
}
5.fileno
int fileno(FILE *stream);
功能:
获得一个文件流指针中的文件描述符
可以认为是将文件流变为文件描述符 FILE* fp -> int fd
参数:
stream:文件流指针
返回值:
成功返回文件描述符
失败返回-1
#include <stdio.h>
#include <unistd.h>int main(int argc, const char *argv[])
{FILE * fp=fopen("1.txt","r");int fd=fileno(fp);if(-1==fd){fprintf(stderr,"flieno error\n");return 1;}char buf[512]={0};read(fd,buf,sizeof(buf));printf("%s\n",buf);fclose(fp);return 0;
}
6.fdopen
FILE *fdopen(int fd, const char *mode);
功能:
将文件描述符转化为文件流指针 int fd -> FILE *fp
参数:
fd:已经打开的文件描述符
mode: "r"
"r+"
"w"
"w+"
"a"
"a+"
注意:原来的权限是O_RDONLY,对应"r",不能修改
返回值:
成功返回文件流指针
失败返回NULL
注意:fileno和fdopen使用封装度高的关闭文件,即fclose();
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, const char *argv[])
{int fd=open("1.txt",O_RDONLY);FILE *fp=fdopen(fd,"r");if(NULL==fp){fprintf(stderr,"fdopen error\n");}char buf[512]={0};fgets(buf,sizeof(buf),fp);printf("%s",buf);fclose(fp);return 0;
}
三、重点
open、read、write
使用read、write函数实现文件复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, const char *argv[])
{if(argc<3){fprintf(stderr,"usage:./a.out srcfile destfile\n");return 1;}int src=open(argv[1],O_RDONLY);int dest=open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0666);if(src==-1 || dest==-1){fprintf(stderr,"open error\n");return 1;}printf("src is %d\n",src);printf("dest is %d\n",dest);while(1){char buf[512]={0};int ret=read(src,buf,sizeof(buf));if(ret<=0){break;}write(dest,buf,ret);}close(src);close(dest);return 0;
}
相关文章:
Linux高级编程 8.13 文件IO
一、文件IO 操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用(unistd.h) 其中有个 文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。 这是一个基于Linux内核的没有缓存的IO机制 文件IO特性&…...
【k8s】ubuntu18.04 containerd 手动从1.7.15 换为1.7.20
ubutnu18.04之前手动安装了1.7.15现在下载1.7.20containerd-1.7.20-linux-amd64.tar.gz root@k8s-worker-i58265u:/home/zhangbin# root@k8s-worker-i58265u:/home/zhangbin# https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-am…...
常用浮动方式
目录 一、标准流 二、float浮动 三、 flex浮动 3.1flex组成 3.2 主轴对齐方式 3.3侧轴对齐方式 3.4修改主轴方向 3.5弹性盒子换行 3.6行对齐方式 一、标准流 标签在网页中的默认排布规则 例如: 块元素独占一行、行内元素可以一行显示多个 二、float浮动 让块…...
设计模式反模式:UML常见误用案例分析
文章目录 设计模式反模式:UML常见误用案例分析1. 反模式概述2. 反模式的 UML 图示误用2.1 God Object 反模式2.2 Spaghetti Code 反模式2.3 Golden Hammer 反模式2.4 Poltergeist 反模式 3. 总结 设计模式反模式:UML常见误用案例分析 在软件工程领域&am…...

Python编码系列—Python SQL与NoSQL数据库交互:深入探索与实战应用
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
贪心算法---跳跃游戏
题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 思路…...

利用EditPlus进行Json数据格式化
利用EditPlus进行Json数据格式化 git下载地址:https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令:Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…...

xss.function靶场(easy)
文章目录 第一关Ma Spaghet!第二关Jefff第三关Ugandan Knuckles第四关Ricardo Milos第五关Ah Thats Hawt第六关Ligma第七关Mafia第八关Ok, Boomer 网址:https://xss.pwnfunction.com/ 第一关Ma Spaghet! 源码 <!-- Challenge --> <h2 id"spaghet&qu…...

【LLM入门】Let‘s reproduce GPT-2 (124M)【完结,重新回顾一下,伟大!】
文章目录 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-3 repro03:56:21 shoutout to llm.c, equivalent but faster code in raw C/CUDA【太牛了ba】03:59:39 summary, phew, build-nanogpt github repo 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-…...
c语言----取反用什么符号
目录 前言 一、逻辑取反 二、按位取反 三、应用场景 前言 在C编程语言中,取反使用符号!表示逻辑取反,而使用~表示按位取反。 其中,逻辑取反!是将表达式的真值(非0值)转换为假(0),…...

【html+css 绚丽Loading】 - 000003 乾坤阴阳轮
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕…...

【Web】巅峰极客2024 部分题解
目录 EncirclingGame GoldenHornKing php_online admin_Test EncirclingGame 玩赢游戏就行 GoldenHornKing 利用点在传入的app 可以打python内存马 /calc?calc_reqconfig.__init__.__globals__[__builtins__][exec](app.add_api_route("/flag",lambda:__i…...

在AMD GPU上进行Grok-1模型的推理
Inferencing with Grok-1 on AMD GPUs — ROCm Blogs 我们展示了如何通过利用ROCm软件平台,能在AMD MI300X GPU加速器上无缝运行xAI公司的Grok-1模型。 介绍 xAI公司在2023年11月发布了Grok-1模型,允许任何人使用、实验和基于它构建。Grok-1的不同之处…...

在亚马逊云科技上部署开源大模型并利用RAG和LangChain开发生成式AI应用
项目简介: 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上利用Sag…...
Spring——Bean的生命周期
Bean的生命周期牵扯到Bean的实例化、属性赋值、初始化、销毁 其中Bean的实例化有四种方法、构造器实例化、静态工厂、实例工厂、实现FactoryBean接口 对于Bean的生命周期我们可以在Bean初始化之后、销毁之前对Bean进行控制 两种方法: 一、配置 1、在Bean的对象…...

云计算实训30——自动化运维(ansible)
自动化运维 ansible----自动化运维工具 特点: 部署简单,使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大,扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器: #下载epel [rootmo ~]# yum -y i…...
网络性能优化:从问题诊断到解决方案
网络性能优化是确保网络高效、稳定运行的关键过程,它通过改进网络设备、协议和配置,以提高网络吞吐量、降低延迟并提升用户体验。在网络性能优化的全过程中,从问题诊断到解决方案的实施,需要经过一系列详细的步骤和策略。本文将从…...
深度学习10--强化学习
强化学习(增强学习、再励学习、评价学习简称RL)是近年来机器学习领域最热门的方向之一,是实现通用人工智能的重要方法之一。本章将通俗易懂地讲一下强化学习中的两个重要的模型DQN 和DDPG。 马尔可夫决策过程(Markov Decison Process,MDP)包括两个对象ÿ…...

SSA-SVM多变量回归预测|樽海鞘群优化算法-支持向量机|Matalb
目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&a…...

KEEPALIVED高可用集群知识大全
目录 一、KEEPALIVED高可用集群简介 1、Keepalived 高可用集群的工作原理 2、Keepalived 高可用集群的作用 二、KEEPALIVED部署 1、网络配置 2、软件安装与启动 3、配置虚拟路由器 4、效果实现 三、启用keepalived日志功能 四、KEEPALIVED的几种工作模式 1、KEEPALI…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...