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

news2025/5/18 13:45:51

中文字库的原理与应用

⦁ 基本概念

一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有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(),就会导致进程结束,则所有的线程就会终止。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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…

【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…

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

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

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

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

C# 组件的使用方法

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

QCustomPlot频谱图

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AI低代码平台:开启高效智能开发新时代

科技飞速发展的当下,全球正加速迈向 AI 化。DeepSeek 等主流 AI 厂商的发展极大地改变了技术格局。众多企业为紧跟时代步伐,对高效开发工具的需求愈发迫切。百特搭AI低代码开发平台与 AI 技术的融合,为企业带来了开发高效化与智能化的全新解决…

苍穹外卖2

根据id查询员工 调用顺序:Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了(ai生成) 由于result泛型中希望返回一个employee对象,所以定义一个employee来接受Service的getbyid方法,在…

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目,从项目的releases可以得知它适用于windows、linux、mac github:https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本(也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道,大模型现在很火爆,尤其是 deepseek 风靡全球后,大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说:“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展,大模型的影响…