当前位置: 首页 > article >正文

文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)

中文字库的原理与应用

⦁ 基本概念

一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。 所以后期中国国家标准总局设计了一套中文字符集叫做GB2312中文简体字符集。

在这里插入图片描述
⦁ 汉字结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⦁ 字库生成
在嵌入式开发中一般都会使用LCD屏或者OLED屏进行汉字显示,所以都需要使用汉字库或者使用取模软件生成汉字的字模,一般都是采用点阵字库。
在这里插入图片描述
在这里插入图片描述
注意:GB2312汉字库的汉字的具体位置和汉字本身大小是无关的,汉字的区码和位码来定位汉字在库的位置,一个汉字的占用字节的大小和汉字本身的分辨率 ,比如1616大小的一个汉字,需要占用32字节。如果生成的是1616的汉字库,则库中每个单元都是32字节。

⦁ 调用字库
其实在linux系统和windows都是存储了汉字库,比如windows系统把汉字库文件都存储在C:\Windows\Fonts,在该路径下存储了很多的.ttf格式的字库文件,ttf格式是TureTypeFont的缩写,是TrueType类型文件。
在这里插入图片描述
同理,ttf类型的字库文件也可以在linux系统上使用,一般linux系统都会把.ttf格式的字库文件存储在 /usr/share/fonts/xxx.ttf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目录检索原理与应用

之前设计的程序只能访问某个路径下的某个文件,如果打算一次访问某个路径下的多个不同类型的文件,就需要用户手动调用open函数实现,但是当文件数量较多时,这种方案并不能满足需求,那请问是否有比较轻松高效的方式来实现访问某个路径下的多个不同类型的文件呢?

回答:当然是有的,在Linux系统下一切皆文件,目录在Linux系统下也属于文件类型之一,可以通过系统IO来进行访问,常见的访问目录的接口有:opendir、readdir、chdir、mkdir、rmdir、remove、getcwd、rewindir等。

⦁ 基本概念

在Linux系统下目录是一种特殊的文件,只不过目录存储的数据的最小单位并不是字符,而是目录项,所以目录与普通文件又有所区别,另外,Linux文件系统下目录和文件夹的含义也并不相同,目录的本质是索引,文件夹的本质是容器。

也就是说,目录是用来保存项目的索引,而不用保存项目本身。Linux 和 UNIX 中的目录并不保存它里面的文件。它们只是记录文件位置的信息。

举个例子:目录和文件夹的区别就相当于门牌号和房子的区别,房子里面可以住人或者存放物品,而门牌号只是记录房子所在的位置,方便用户寻找和访问。
在这里插入图片描述
可以看到,在 Linux 或 Unix 操作系统中所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。

Linux系统的文件系统的最顶层是由根目录开始的,使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

⦁ 磁盘结构

思考:如果Linux系统的目录并不存储文件的实际数据内容,而是存储目录项,那请问文件实际的内容存储在哪里?目录的目录项又是什么东西?

回答:文件数据是储存在磁盘上的,磁盘一般就是指计算机的硬盘,硬盘存储数据的最小存储单位叫做扇区。一般计算机每个扇区(Sector)存储512字节,而连续的8个扇区组成了一个数据块(Block),大小为4KB。

计算机一般是以数据块(Block)为单位访问数据,因为这样可以提高CPU的访问效率,而文件数据都存储在数据块中,所以为了能够方便找到数据块中存储数据的位置,就必须找到一个地方存储文件的属性(比如文件的字节数、文件的读写权限、文件的时间戳等),这种存储文件属性信息的区域叫做inode,中文翻译为索引节点,在Linux系统下inode其实是以结构体的形式来存储文件信息的,可以通过man手册的第7章了解inode,如 man 7 inode。
在这里插入图片描述
所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区(block),存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。inode区是以数组的形式存储的,数组下标就是inode编号,每个元素就是一个结构体,inode结构体中会有一个指针指向block区,也就是指向存放文件内容的数据块。

在这里插入图片描述
思考:既然Linux的文件系统中的每个文件都有一个inode,并且每个inode都有编号,请问应该如何查看文件的inode的编号?

回答:可以直接通过shell命令: ls,有2个选项: -l 显示详细信息 -i 打印文件的索引
在这里插入图片描述
⦁ 接口说明
(1) 创建目录

Linux系统提供了一个用于创建目录的mkdir函数接口,第一个参数pathname指的是目录的路径,第二个参数mode用来指定新目录的模式。
在这里插入图片描述
(2) 删除目录

Linux系统提供了一个用于删除空目录的rmdir函数接口,第一个参数pathname指的是待删除目录的路径。
在这里插入图片描述
(3) 打开目录

Linux系统提供了一个用于打开目录的opendir函数接口,第一个参数pathname指的是待打开目录的路径。
在这里插入图片描述
(4) 进入目录

另外,打开目录并不意味着进入目录,而获取目录里面的文件的信息必须要先进入目录,可以用函数 chdir() 进入目录。
在这里插入图片描述
(5) 读取目录

Linux系统提供了一个用于读取目录的readdir函数接口,第一个参数dirp指的是待读取目录的目录指针。函数成功返回一个指向该目录中下一个目录项的指针,失败返回NULL。
在这里插入图片描述
思考:如果某个目录下存储3个普通文件和1个文件夹,但是程序输出结果并不能区分出来文件的类型,请问应该如何解决该问题?

回答:如果想要区分磁盘中的文件类型,第一个方案是可以利用readdir函数返回的目录项中的成员,另一个方案则是利用stat函数获取文件的信息。

(6) 文件属性

Linux系统提供了一个用于获取文件信息的stat函数接口,第一个参数path指的是待读取文件的路径,第二个参数指的是获取的文件信息结构体的地址。

在这里插入图片描述
在这里插入图片描述
在结构体 stat 中文件的类型和权限并没有分开存储,而被统一存储到同一个成员 st_mode中。
在这里插入图片描述

并发编程的原理与应用

⦁ 线程的概念

思考:一个项目中可能很多的功能模块需要同时运行,并且每个模块中都有独立的循环,但是循环内部没有编写退出条件,就会出现死循环的现象,无法让多个模块同时运行,请问如何解决该问题?

回答:可以在一个进程中创建多条线程来解决,进程指的是进行中的程序,也就是说一个程序得到运行就会变为进程。

windows系统和linux系统都是多任务的操作系统,任务(task)就是系统调度器的调度实体,而任务是存在在进程中的,只不过有些进程中只有一个任务,有些进程中则可能会存在多个任务。

操作系统是以进程为单位分配资源的,如果一个进程中只有一个任务,则该任务拥有进程的全部资源,如果进程中有多个任务,则这些任务共享进程的资源。为了可以让进程中的多个任务得到运行,可以把任务放在线程(thread)中,然后由调度器进行调度,而线程是系统调度资源的最小单位。

线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。一个工厂可以容纳多个工人,工厂负责为所有工人提供必要的资源(电力、产品原料、食堂、厕所等),所有工人共享这些资源,每个工人负责完成一项具体的任务,他们相互配合,共同保证整个工厂的平稳运行。

每个进程执行前,操作系统都会为其分配所需的资源,包括要执行的程序代码、数据、内存空间、文件资源等。一个进程至少包含 1个主线程,可以包含n个子线程,所有线程共享进程的资源,各个线程也可以拥有属于自己的私有资源。
在这里插入图片描述
注意:由于系统分配资源是以进程为单位的,而进程至少会执行一个任务,如果进程没有创建其他线程,则程序中的main函数就是一条线程,也被称为主线程。

⦁ 线程的创建

思考:既然进程中可以存在多条线程,每条线程可以执行一个任务,并且线程之间是并发执行的,那请问如何创建线程,以及如何让线程执行某个指定的任务?

回答:用户可以调用线程库中的一个函数实现线程的创建,函数接口叫做:pthread_create()

在这里插入图片描述
注意:线程使用的是进程的资源,所以进程退出之后线程也会退出,而进程结束的条件之一就是程序的main函数退出,所以也就是当程序中的main函数退出时,其他的线程也会一起退出。

⦁ 线程的结束

思考:如果用户打算创建一个线程执行一个任务,但是需要线程执行完该任务之后就退出,请问能否实现?如果可以实现,应该如何实现?

回答:Linux系统提供多种方式让线程终止,其中比较常用的方式是调用pthread_exit()函数,利用该接口可以实现让线程终止的目的。

在这里插入图片描述
注意:主线程如果调用该函数也可以被终止,但是不会影响进程中其他线程的运行,但是如果主线程中调用exit(),就会导致进程结束,则所有的线程就会终止。

相关文章:

文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)

中文字库的原理与应用 ⦁ 基本概念 一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。 所以后期中国国家标准总局设…...

基于SpringBoot的智慧社区管理系统(源码+数据库)

499基于SpringBoot的智慧社区管理系统,系统包含三种角色:管理员、用户主要功能如下。 【用户功能】 1. 首页:查看系统。 2. 超市商品:浏览超市中各类商品信息。 3. 动物信息:了解社区内的动物种类和相关信息。 4. 车位…...

OpenCV 伪彩色处理

伪彩色处理是将灰度图像通过颜色映射转换为彩色图像的技术,常用于增强可视化效果或突出显示特定灰度范围。OpenCV 提供了多种方法实现伪彩色处理。 1. 使用 applyColorMap 函数 OpenCV 提供了 cv::applyColorMap() 函数,支持多种预定义的色彩映射&…...

ADI 算法,ADAU1452算法

MCU控制DSP的公式...

低代码控件开发平台:飞帆中粘贴富文本的控件

效果: 链接: https://fvi.cn/729...

ICRA-2025 | 视觉预测助力机器人自主导航!NavigateDiff:视觉引导的零样本导航助理

论文:Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1单位: 1 ^{1} 1中山大学, 2 ^{2} 2香港中文大学深圳校区论文标题:NavigateDiff: Visual Predictors are Ze…...

[问题帖] vscode 重启远程终端

原理 有的时候,在vscode 远程ssh连接到服务器的时候,可能遇到需要重启终端才能生效的配置,比如add group的时候,而此时无论你是关闭vscode终端重启,还是reload窗口都是没用的。 因为不管你本地是否连接了远程的vscode服…...

2025年前端框架全景解析:React、Vue、Angular的生态与未来之争

一、市场格局:全球与国内的双重差异12 全球市场React:凭借Facebook的支持和庞大的社区,全球使用率超40%,尤其在数据密集型应用(如金融、社交平台)中占据主导。其跨平台能力(React Native)和灵活生态(Next.js、Redux)是核心竞争力。Vue:亚洲市场占比显著,中国开发者…...

【Linux】Orin NX编译 linux 内核及内核模块

1、下载交叉编译工具:gcc 1)下载地址:https://developer.nvidia.com/embedded/jetson-linux 选择TOOLS中的交叉编译工具:gcc 11.3 2)解压 将gcc编译器解压到指定目录中,如:/home/laoer/nvidia/gcc 3)配置环境变量 创建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…...

Java 读取 csv 文件

1、引入 maven 依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.9.0</version> </dependency>2、java 代码 /*** csv 内容解析** param filePath 文件路径* para…...

蓝桥杯考前复盘

明天就是考试了&#xff0c;适当的停下刷题的步伐。 静静回望、思考、总结一下&#xff0c;我走过的步伐。 考试不是结束&#xff0c;他只是检测这一段时间学习成果的工具。 该继续走的路&#xff0c;还是要继续走的。 只是最近&#xff0c;我偶尔会感到迷惘&#xff0c;看…...

【C++经典例题】字符串转整数(atoi)的实现与解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;C经典例题 期待您的关注 目录 一、问题描述 二、解题思路 三、代码实现 四、代码逻辑详解 1. 变量初始化 2. 忽略前导空格 …...

Java面试黄金宝典44

1. 查看进程的运行堆栈信息命令 gstack gstack 是 Linux 系统下用于查看指定进程运行时堆栈信息的工具。当程序出现崩溃、死锁或者性能瓶颈等问题时,借助 gstack 可以查看进程中各个线程的调用栈,从而辅助开发人员定位问题。 定义 gstack 本质上是一个封装了底层 ptrace 系统…...

批量统一图像色彩

图嗯&#xff0c;用户之前问过如何批量统一多张图片的色调&#xff0c;我给出了几种方法&#xff0c;包括Photoshop、Lightroom、GIMP、在线工具和AI工具。现在用户进一步说明&#xff0c;他有一张红蓝色的图&#xff0c;其他几张是各种颜色&#xff0c;想用代码或AI批量将它们…...

数据库数据恢复——sql server数据库被加密怎么恢复数据?

SQL server数据库数据故障&#xff1a; SQL server数据库被加密&#xff0c;无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密&#xff0c;文件名字被篡改。 SQL server数据库数据恢复过程&#xff1a; 1、将所有数据库做完整只读备份。后续所有数据恢…...

蓝桥杯C++组部分填空题

P1508 - [蓝桥杯2020初赛] 门牌制作 - New Online Judge #include<bits/stdc.h> using namespace std;int main() {int res 0;for(int i 1; i < 2020; i){int num i;while(num){if(num % 10 2) res;num/10;}}cout<<res;return 0; } 624 P1509 - [蓝桥杯20…...

C# 组件的使用方法

类 Stopwatch 计算时间 Stopwatch sw new Stopwatch(); sw.Start(); // 要执行的代码块 Thread.Sleep(2000);sw.ElapsedMilliseconds // 消耗时间 Console.WriteLine(sw.ElapsedMilliseconds);组件 ListView 属性设置 外观 - View - Details 行为 - Columns -&#xff08;…...

Python 装饰器(Decorator)

文章目录 代码解析1. 装饰器定义 timer(func)2. 应用装饰器 timer **执行流程****关键点****实际应用场景****改进版本&#xff08;带 functools.wraps&#xff09;** 这是一个 Python 装饰器&#xff08;Decorator&#xff09; 的示例&#xff0c;用于测量函数的执行时间。下…...

QCustomPlot频谱图

使用QCutomPlot做的读取txt文件显示频谱图的demo,帮助大家了解QCustomPlot的基本使用 1.运行结果 demo比较简单,用于文件读取,鼠标放大缩小,右键截图等基础功能. 2.绘图详解 绘图核心是将类提升为QCustomPlot之后进行重绘,重绘之前设计图表曲线,图标标题,坐标轴,坐标轴范围,背…...

高并发的业务场景下,如何防止数据库事务死锁

一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…...

【Grok 大模型深度解析】第二期:架构探秘与训练哲学

在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…...

Spring Boot(九十):集成SSE (Server-Sent Events) 服务器实时推送

1 SSE简介 Server-sent Events(SSE) 是一种基于 HTTP 协议的服务器推送技术,它允许服务器主动向客户端发送数据。与 WebSocket 不同,SSE 是单向通信,即服务器可以主动向客户端推送数据,而客户端只能接收数据。 2 SSE特点 单向通信:SSE 是服务器向客户端的单向推送,客户…...

2025第四届大学生算法挑战赛(进阶训练1) A-E 题解报告

前言 这是第四届大学生算法挑战赛的练习赛系列&#xff0c;这个比赛是国家一级协会的。 这章是进阶训练1的A-E题&#xff0c;感觉还是蛮基础的。 题解 第四届大学生算法挑战赛 进阶训练1 A. 小理养鱼 思路: 博弈 斐波那契数组 省流描述: 经典的羊狼博弈&#xff0c;即1只…...

P8668 [蓝桥杯 2018 省 B] 螺旋折线

题目 思路 一眼找规律题&#xff0c;都 1 0 9 10^9 109说明枚举必然超时&#xff0c;找规律&#xff0c;每个点找好像没有什么规律&#xff0c;尝试找一下特殊点&#xff0c;比如&#xff1a;对角线上的点 4 16 36(右上角&#xff09; 4k^2&#xff0c;看在第几层&#xff08;…...

Matlab 三容水箱系统故障诊断算法研究

1、内容简介 Matlab 190-三容水箱系统故障诊断算法研究 可以交流、咨询、答疑 2、内容说明 略 其次&#xff0c;对 DTS200 三容水箱系统进行机理建模&#xff0c;可分为对象建模和故障 建模&#xff0c;搭建了水箱系统的 SIMULINK 模型并建立了基于 Taylor 展开及 T-…...

查看容器内的eth0网卡对应宿主机上的哪块网卡

查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…...

【 Beautiful Soup (bs4) 详解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库&#xff0c;能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup&#xff1a;主类&#xff0c;用于构建文档树结构Tag&#xff1a;表示 HTML/XML 标签的对象…...

RT-DETR-R18版本的ultralytics的yaml更改分享!!

0.前言 起因&#xff1a; 本人深度学习&#xff0c;无奈组内没有好的显卡&#xff0c;只有我自己拥有的一张4060卡跑CV&#xff0c;稍微大一点的模型跑不了&#xff0c;我的模型主打一个轻量化... 在找模型与我的模型进行比较的时候&#xff0c;看的RT-DETR-R18版本(GFLPOS也…...

网工基础 | 常见英文术语注解

原创&#xff1a;厦门微思网络 以下是一些网工专业常见的英文术语注解&#xff1a; IP Address&#xff08;Internet Protocol Address&#xff09; 互联网协议地址&#xff0c;是分配给连接到互联网的设备的唯一标识符&#xff0c;用于在网络中定位和通信。例如&#xff0c;“…...

[特殊字符] 各领域 Dummy 开关实现方式大集合

涵盖硬件、软件、工业控制、游戏开发及网络虚拟化场景&#xff1a; &#x1f50c; 1. 电子 / 硬件工程 &#x1f6e0;️ (1) 物理替代方案 &#x1f9f2; 跳线帽&#xff08;Jumper&#xff09;或短路块 &#x1f449; 模拟开关“开/关”状态 ✅ 示例&#xff1a;开发板上的 B…...