【Linux】简单设计libc库
📝前言:
经过之间两篇文章,【Linux】基础IO(一)和【Linux】基础IO(二)的学些,我们对文件的基础IO已经有了一定的理解。
这篇文章我们来简单设计一下libc库,来复习一下文件基础IO的知识
🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏
目录
- 一,综述
- 二,Linux内核的_IO_FILE
- 三,mystdio.h的编写
- 实现
- 四,mystdio.c的编写
- 接口介绍
- 实现
- 五,test.c测试
一,综述
目标:用我们的文件实现文件的写入操作
本文主要完成三个文件的编写
mystdio.h
:头文件,主要用于声明函数,提供接口mystdio.c
:源文件,用于实现头文件中声明的函数和全局变量test.c
:测试文件
二,Linux内核的_IO_FILE
如图,这就是C库里面,管理文件的结构体
三,mystdio.h的编写
- C语言库的
FILE
结构体,就是struct _IO_FILE FILE
结构体typedef
来的 - 目标封装:
IO_FILE
结构体(C语言的结构体),核心参数int flag
:文件的刷新方式int fileno
:文件描述符char outbuffer[SIZE]
:输出缓冲区(语言层)int cap
:缓冲区的总容量int size
:缓冲区已经使用的字节数
myopen
、mywrite
、myfflush
、myclose
操作,模拟C语言里面库函数的调用
实现
1 #pragma once2 3 #define MAXSIZE 10244 5 #define FLUSH_N 06 #define FLUSH_L 17 #define FLUSH_F 28 9 struct IO_FILE10 {11 int flag;12 int fileno;13 char outbuffer[MAXSIZE];14 int cap;15 int size;16 };17 18 typedef struct IO_FILE MYFILE;19 20 MYFILE* myfopen(const char* pathname, const char* mode);21 int myfwrite(const void* ptr, int num, MYFILE* stream); //void* ptr这使得 mfwrite 函数能够接受任意类型的数据缓冲区。 22 void myfflush(MYFILE* stream);23 void myfclose(MYFILE* stream);
四,mystdio.c的编写
接口介绍
memcpy:
- 原型:
void* memcpy(void* dest, const void* src, size_t n);
dest
:目标内存区域的起始地址(需确保有足够空间)src
:源内存区域的起始地址(只读)n
:要复制的字节数(size_t
类型,通常由sizeof
或手动计算得到)
fsync:
- 传入文件描述符,把对应的内核文件缓冲区刷新到外设(我们不用管如何刷新的,只要知道能刷新就行了)
open、close等文件的系统调用不过多赘述,如果不懂的可以这篇文章:【Linux】基础IO(一)
实现
1 #include "mystdio.h"2 #include <string.h>3 #include <stdlib.h>4 #include <sys/stat.h>5 #include <sys/types.h>6 #include <fcntl.h>7 #include <unistd.h>8 9 MYFILE* myfopen(const char* pathname, const char* mode)10 {11 // opne时,如果对不存在的文件,那就要创建文件并且初始化FILE结构体12 int fd = -1; // 代表 open失败13 // 对于不同的打开方式,我们主要通过更新它的 FILE 来体现文件不同的状态14 if(strcmp(mode, "r") == 0)15 {16 fd = open(pathname, O_RDONLY); // 封装系统调用17 }18 else if(strcmp(mode, "w") == 0)19 {20 fd = open(pathname, O_CREAT|O_WRONLY|O_TRUNC, 06660);21 }22 else if(strcmp(mode, "a") == 0)23 {24 fd = open(pathname, O_CREAT|O_WRONLY|O_APPEND, 06660);25 }26 if(fd < 0) return NULL; // 代表开失败了27 MYFILE* mf = (MYFILE*)malloc(sizeof(MYFILE)); // 申请MYFILE结构体,给新的文件28 if(!mf) // 分配失败29 {30 close(fd);31 return NULL;32 }33 mf -> fileno = fd;34 mf -> flag = FLUSH_L; // 我们默认用行刷新,简单一点35 mf -> size = 0;36 mf -> cap = MAXSIZE;37 38 return mf;39 }40 int myfwrite(const void* ptr, int num, MYFILE* stream)41 {42 // 语言层写到缓冲区,本质是拷贝 43 memcpy(stream->outbuffer + stream->size, ptr, num);44 stream -> size += num;45 if(stream -> size > 0 && stream -> flag == FLUSH_L && stream -> outbuffer[stream->size - 1] == '\n')46 {47 myfflush(stream);48 }49 return num;50 }51 void myfflush(MYFILE* stream)52 {53 if(stream->size > 0)54 {55 write(stream->fileno, stream->outbuffer, stream->size);56 // 刷新到外设57 fsync(stream->fileno);58 stream->size = 0;59 }60 }61 void myfclose(MYFILE* stream)62 {63 if(stream->size > 0)64 {65 myfflush(stream);66 }67 close(stream->fileno);68 }69
五,test.c测试
测试往文件log.txt
里面写入信息,看是否写入成功
代码:
1 #include "mystdio.h"2 #include <stdio.h>3 #include <string.h>4 #include <unistd.h>5 6 int main()7 {8 MYFILE* fp = myfopen("./log.txt", "a");9 if(fp == NULL)10 {11 printf("打开失败");12 return 1;13 }14 int cnt = 3; 15 while(cnt)16 {17 printf("write %d\n", cnt);18 char buffer[64];19 snprintf(buffer, sizeof(buffer),"hello message, number is : %d\n", cnt);20 cnt--;21 myfwrite(buffer, strlen(buffer), fp);22 myfflush(fp);23 sleep(1);24 }25 myfclose(fp);26 return 0;27 }
运行结果:
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
【Linux】简单设计libc库
📝前言: 经过之间两篇文章,【Linux】基础IO(一)和【Linux】基础IO(二)的学些,我们对文件的基础IO已经有了一定的理解。 这篇文章我们来简单设计一下libc库,来复习一下文…...
3335. 字符串转换后的长度 I
3335. 字符串转换后的长度 I class Solution:def lengthAfterTransformations(self, s: str, t: int) -> int:# 大质数mod 10**97# 创建一个长度为26的数组cnt,对应26个小写字母cnt [0]*26# 计算出s中26个字符分别有多少个for ch in s:cnt[ord(ch)-ord(a)] 1f…...
《医院网络安全运营能力成熟度评估指南》(试行版)研究解读
引言 随着数字化转型的不断深入,医院信息化建设已从单点应用走向全面系统集成,信息系统已成为支撑医院业务运行和管理决策的基础设施。然而,信息化发展也带来了日益复杂的网络安全挑战,从传统的边界防护到如今的全方位安全威胁,医院网络安全建设面临着前所未有的压力。20…...
鸿蒙5.0项目开发——鸿蒙天气项目的实现(介绍)
【高心星出品】 文章目录 项目简介:项目运行效果图:主要功能:使用的技能点:开发环境: 项目简介: 这是一个基于鸿蒙系统(HarmonyOS)开发的天气应用,采用 ArkTS 语言开发&…...
软考软件测评师——计算机网络
目录 第一部分 核心知识点解析 1. IPv4地址规范 2. 层次化网络架构 3. 网络设备解析 4. URL结构规范 5. 关键网络命令 6. SNMP配置要求 第二部分 历年真题精析 2020年真题 2016年真题 2015年真题 高频考点总结 第一部分 核心知识点解析 1. IPv4地址规范 特殊地址说…...
Node.js 中的 URL 模块
一、URL 模块基础 1. 模块导入方式 // Node.js 方式 const url require(url);// ES 模块方式 (Node.js 14 或启用 ESM) import * as url from url; 2. 核心功能 解析 URL 字符串 格式化 URL 对象 URL 处理工具方法 WHATWG URL 标准实现 二、URL 解析与构建 1. 传统解…...
JavaWeb 前端开发
JavaWeb前端 初识 HTMLCSS 入门程序 什么是HTML HTML是由标签构成的 什么是CSS HTML快速入门 标签可以是大写,也可以是小写,也可以是大小写混用。 属性值也可以使用单引号,但一般使用双引号。 HTML的语法结构比较松散,不严谨…...
设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析
目录 一、策略模式:AI大模型的动态决策引擎 1.1 核心原理与工业级实现 1.2 AI时代的技术演进 二、模板方法模式:AI流水线的标准化基石 2.1 多模态处理框架设计 三、策略与模板方法的协同创新 3.1 电商推荐系统实践 四、前沿趋势与挑战 4.1 量子计算增强模式 五、伦理…...
2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
2. 盒模型/布局模块 - 响应式产品展示页 案例:电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…...
H5S 视频监控AWS S3 对象存储
本文介绍一下如何使用S3对象存储作为H5S 存储空间进行录像存储 然后创建一个对象存储,本文以minio 为例(实际项目亲测天翼云): 首先安装 s3fs 如果是redhat系列,使用如下命令 sudo yum install epel-release sudo yum install s3fs-fuse …...
Visual Studio 2022 跨网络远程调试
🚀 Visual Studio 2022 跨网络远程调试实践指南 在本地开发软件时,Visual Studio 的调试器是我们最依赖的工具之一。但是当目标程序运行在远程设备上,例如测试服务器、工控设备或嵌入式终端,如何实现 跨网络远程调试 成为了开发中…...
最短路与拓扑(1)
1、找最长良序字符串 #include<bits/stdc.h> using namespace std; const int N105; int dis[N]; int vis[N]; int edge[N][N]; int n,m; int vnum;void dij(int u, int v) {// 初始化距离数组和访问标记for(int i0; i<vnum; i) {vis[i] 0;dis[i] edge[u][i];}// D…...
【前缀和】和为 K 的子数组(medium)
【前缀和】和为 K 的子数组 题目描述算法原理和细节问题代码 题目描述 和为 K 的子数组 给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。 示例 1: 输入:nums [1,1,1], k 2 输出: 2 解释: 此题 [1,1] 与 [1,1] 为两种不同的…...
深入理解 JVM:StackOverFlow、OOM 与 GC overhead limit exceeded 的本质剖析及 Stack 与 Heap 的差异
摘要 在 Java 开发过程中,内存管理相关的问题一直是开发者需要重点关注的领域。StackOverFlow、OutOfMemory(OOM)和GC overhead limit exceeded是常见的运行时错误,而理解Stack(栈)和Heap(堆&a…...
汽车功能安全--TC3xx MBIST设计要点
英飞凌针对硬件潜伏故障的自测,提供了四种机制:PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我们已经聊过了,今天就快速介绍下MBIST。 MBIST,全程Memory Built-in Self Test,用于检测SRAM数据单元的完整性。 在2…...
blazor与硬件通信实现案例
在网页接入硬件交互通信方案这篇博客中,曾经提到了网页中接入各种硬件操作的方法,即通过Windows Service作为指令的中转,并建立websocket通信连接,进而实现接入硬件的各种操作。这篇博客就以实际的案例来讲解具体怎么实现。 一、建立Windows Service项目 比如我就建立了一…...
思迈特软件携手天阳科技,打造ChatBI金融智能分析新标杆
5月10日,广州思迈特软件有限公司(以下简称“思迈特软件”)与天阳宏业科技股份有限公司(以下简称“天阳科技”)在北京正式签署战略合作协议。思迈特软件董事长吴华夫、CEO姚诗成,天阳科技董事长兼总裁欧阳建…...
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
在上一篇中,我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到,微服务架构的一个核心挑战在于,服务实例的网络位置是动态的,服务之间需要一种机制来互相定位。 想象一下,你开了一家新…...
Linux之初见进程
1. 冯诺依曼体系结构 冯诺依曼体系结构是计算机的基本设计原则之一,也被认为是现代计算机的基础。它由美国数学家约翰冯诺伊曼在20世纪40年代后期提出。冯诺依曼体系结构包括存储程序概念、将数据和指令存储在同一存储器中、按照顺序执行指令等关键特征。 具体来说…...
Docker入门教程:常用命令与基础概念
目录 简介常用命令Docker 常用命令汇总docker run 命令格式与参数解析 简介 Docker 是一个客户端-服务器(client-server)架构的应用程序,其中包含两个主要组件:Docker 客户端和 Docker 守护进程(也称为 Docker Daemon…...
内核深入学习3——分析ARM32和ARM64体系架构下的Linux内存区域示意图与页表的建立流程
内核深入学习3——ARM32/ARM64在Linux内核中的实现(2) 今天我们来讨论的是一个硬核的内容,也是一个老生常谈的话题——那就是分析ARM32和ARM64体系架构下的Linux内存区域示意图的内容。对于ARM64的部分,我们早就知道一个基本的…...
vim 练习题
文章目录 前言:学习了vim基础命令,上机实操下吧命令模式练习插入模式练习末行模式练习视图模式练习高级操作练习 总结 前言:学习了vim基础命令,上机实操下吧 命令模式练习 打开任意文本文件,使用gg跳转到首行&#x…...
CSS3 选择器完全指南:从基础到高级的元素定位技术
CSS3选择器完全指南:从基础到高级的元素定位技术 一、基本选择器:精准定位的基石 (一)元素选择器 通过元素标签名直接匹配页面元素,语法简洁直观: p { color: #333; } /* 选择所有<p>元素 */ div…...
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation
SAM的火爆也带来了一项新的任务:Promptable Segmentation,并且作者在文中对比了交互式分割Interactive Segmentation,并且在训练过程中也参考了交互式分割的训练方法,那么可提示分割与交互式分割有什么区别? 个人观点…...
k8s初始化时候,报错无法通过 CRI(容器运行时接口)与 containerd 通信
报错主要信息处 [reset] Unmounting mounted directories in “/var/lib/kubelet” W0513 11:34:19.818023 27124 cleanupnode.go:134] [reset] Failed to evaluate the “/var/lib/kubelet” directory. Skipping its unmount and cleanup: lstat /var/lib/kubelet: no such f…...
k8s之k8s集群部署
一、kubernetes基础环境搭建 1.安装虚拟机 2. 基础环境配置 2.1 关闭防火墙 更改主机名 #系统更新 sudo dnf update -y # 关闭防火墙 sudo systemctl stop firewalld sudo systemctl disable firewalld # 临时关闭 SELinux sudo setenforce 0 # 永久关闭 SELinux sudo sed -i…...
百度智能云千帆携手联想,共创MCP生态宇宙
5月7日,2025联想创新科技大会(Tech World)在上海世博中心举行,本届大会以“让AI成为创新生产力”为主题。会上,联想集团董事长兼CEO杨元庆展示了包括覆盖全场景的超级智能体矩阵,包括个人超级智能体、企业超…...
黑白浮生项目测试报告
文章目录 一、项目背景二、项目功能三、测试计划1. 功能测试1.1 注册页面1.1.1 正常注册1.1.2 异常注册 1.2 登录页面1.2.1 正常登录1.2.2 异常登录 1.3 游戏大厅页面1.3.1 开始匹配1.3.2 取消匹配 1.4 游戏房间页面1.4.1 落子1.4.2 游戏结束 2. 自动化测试2.1 创建浏览器驱动类…...
《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数
文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …...
k8s v1.26 实战csi-nfs 部署
一 前言 使用自开发的一键k8s基础环境部署后,存储需要解决,就是测试环境故选择nfs比较简单,翻阅很多网上资料感觉都不是很全面,结合网上资料折腾了一天,总算是完成了csi-nfs部署。其实之前也部署过,经过一…...
测试集群的功能-执行wordcount程序
具体的操作步骤如下: 确保hadoop是正确运行的。hdfs和yarn都正常启动了。在集群根目录下创建wcinput目录,并在它的下面上传两个文本文件word1.txt, word2.txt,其中保存了要测试的单词信息。在任意一台设备中,进入到hadoop的主目录…...
聊一聊Electron中Chromium多进程架构
Chromium 多进程架构概述 Chromium 的多进程架构是其核心设计之一,旨在提高浏览器的稳定性、安全性和性能。Chromium 将不同的功能模块分配到独立的进程中,每个进程相互隔离,避免了单进程架构中一个模块的崩溃导致整个浏览器崩溃的问题。 在…...
虹科技术 | 简化汽车零部件测试:LIN/CAN总线设备的按键触发功能实现
汽车零部件测试领域对操作的便捷性要求越来越高,虹科Baby-LIN-RC系列产品为这一需求提供了完美的解决方案。从基础的按键设置到高级的Shift键应用,本文将一步步引导您了解虹科Baby-LIN-RC系列产品的智能控制之道。 虹科Baby-LIN-3-RC 想象一下࿰…...
前端开发避坑指南:React 代理配置常见问题与解决方案
前端开发避坑指南:React 代理配置常见问题与解决方案 一、为什么需要配置代理?二、使用 create-react-app 默认配置代理三、使用 http-proxy-middleware 配置复杂代理四、高级代理配置五、生产环境中的代理配置一、为什么需要配置代理? React 应用在开发过程中经常需要与后端…...
43、Server.UrlEncode、HttpUtility.UrlDecode的区别?
Server.UrlEncode 和 HttpUtility.UrlDecode 是 .NET 中用于处理 URL 编码/解码的两个不同方法,主要区别在于所属命名空间、使用场景和具体行为。以下是详细对比: 1. 所属类库与命名空间 Server.UrlEncode 属于 System.Web.HttpServerUtility 类。通常…...
Azure 应用的托管身份与服务主体
Microsoft Entra ID -- 前称 Azure Active Directory -- 提供强大的身份验证和授权功能。托管身份和服务主体通过限制凭据暴露的风险来帮助确保对 Azure 资源的访问安全。 托管身份为Azure原生应用程序自动管理身份,而服务主体则非常适合需要访问Azure资源的外部应…...
音频特征工具Librosa包的使用
深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 要使用深度学习与语音特征进行抽取,首先需要准备能够对语音特征进行解析的工具。 Librosa是一个用于音频、音乐分析与处理的Python工具包&#x…...
Mapreduce初使用
(一)MapReduce的定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个…...
Samtec助力电视广播行业
【摘要前言】 现代广播电视技术最有趣的方面之一就是界限的模糊。过去,音频和视频是通过射频电缆传输的模拟技术采集的,而现在,数字世界已经取代了模拟技术。物理胶片和磁带已让位于数字存储设备和流媒体。 在这个过程中,连接器…...
根据输入的数据渲染柱形图
背景:根据不同季度的销售额,生成对应的柱形图,直观的看出差异 效果: 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatibl…...
Three.js模型材质调整与性能优化实战
一、材质基础调整 1.1 颜色与透明度控制 通过Material.color属性可直接修改材质颜色: material.color new THREE.Color(0xff0000); // 红色结合opacity属性实现透明效果: material.opacity 0.5; // 50%透明度如需动态调整,可通过Color.…...
QEMU模拟32位ARM实现自定义系统调用
实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考:使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码,下载链接:下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test: /…...
AWS IoT Core自定义域名配置实战指南
在使用AWS IoT Core时,配置自定义域名可以为您的IoT解决方案带来多方面的好处。本文将详细介绍如何在AWS IoT Core中设置和使用自定义域名,包括证书配置、域名设置以及DNS记录创建等关键步骤。 为什么要使用自定义域名? 使用自定义域名(也称为客户管理的域名)有以下几个主要…...
【C盘空间不足怎么办】
C 盘空间不足是一个常见的问题,即使感觉没怎么用,也可能被各种文件悄悄占满。这里分析一下常见的原因和排查方向: 一、 常见的空间占用大户: Windows 系统文件和更新: Windows Update 缓存: 系统更新后&am…...
workman进阶应用 GatewayWorker 仿微信 做聊天室
聊天室主要用到GatewayWorker ,它是对workerman的进一步封装 GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、物联网、智能家居等等。 1. 安装环境 1.1 首先下载框架 compos…...
WebRTC技术EasyRTC嵌入式音视频通信SDK打造远程实时视频通话监控巡检解决方案
一、方案概述 在现代工业生产、基础设施维护等领域,远程监控与巡检工作至关重要。传统的监控与巡检方式存在效率低、成本高、实时性差等问题。EasyRTC作为一种先进的实时音视频通信技术,具备低延迟、高稳定性、跨平台等特性,能够有效解决这…...
window 显示驱动开发-创建分配时指定段
显示微型端口驱动程序指定并返回有关其内存段的信息,当视频内存管理器调用驱动程序的 DxgkDdiCreateAllocation 函数时,它更喜欢视频内存管理器使用这些信息。 在调用 DxgkDdiCreateAllocation 时,驱动程序为视频资源创建分配。 驱动程序在描…...
如何创建企业微信应用,如何给企业微信发送消息
首先打开你的企业微信 然后在下面创建应用 我创建的是 pes 设置域名和白名单 等你要开发的时候 就需要配置了 然后就能直接在本地发送企业微信消息了 切记 要配置白名单ip 如果要获取所有部门信息,旧得接口已经不能用了,只能获取所有部门id 前提是…...
WM_TIMER定时器消息优先级低,可能会被系统丢弃,导致定时任务无法正常执行
之前在优化电子白板绘制曲线功能时就遇到WM_TIMER定时器消息被丢弃的问题。原先在绘制曲线图元时,左键按下后一直不放,拖动鼠标绘制曲线(不断绘制一些小线段形成曲线),等到左键弹起后完成一个完整曲线的绘制࿰…...
在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层
在现代Web 3D应用开发中,Babylon.js作为强大的3D引擎被广泛应用。一个常见的需求是实现场景截图功能,特别是当场景中包含HTML覆盖层(如UI控件、菜单等)时。本文将深入探讨如何在Babylon.js中实现完整的截图方案。 问题背景 这里我是希望实现一个渐隐的…...