- 博客(55)
- 收藏
- 关注
原创 Shell脚本编程:原理与应用详解
脚本语言例如Python、JS、Shell等,它们都是不需要编译的解释性编程语言,一般脚本语言都需要解释器,解释器的种类有很多,常见的脚本解释器有:bash、dash、csh、sh 等。是一种用于处理文本的编程语言工具,它以行为单位,每次读取文件中的一行,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个过滤步骤。中的过滤器结合使用,过滤器指的是从文件读取数据,并对这些数据加以筛选、修订,然后输出,过程就像一根水管中间的过滤器,将水处理后再输送到下一环节进行处理,常用的过滤器有。
2025-08-28 11:32:51
630
原创 Makefile构建优化:提升编译效率的关键
A = apple以上三个变量都是自定义变量,其中变量A包含了一个单词,变量B的值包含了三个单词,变量C的值引用了变量A的值,因此他的值是。如果要将这三个变量的值打印出来,可以这么写:既然是类似宏,所以在使用是需要添加特殊符号的:$( ),终端有如下显示。45 all:6 @echo $(A) //echo前面的@代表命令本身不打印出来appleapple tree使用自定义变量,可以将前面的工程配置文件256 a.o:a.c8 b.o:b.c10 x.o:x.c。
2025-08-26 15:44:41
637
原创 语音识别:概念与接口
例如,语音助手可以通过语音转文字将用户的语音指令转换为文本,然后利用文字转语音将回复信息转化为语音输出,实现与用户的自然交流。科大讯飞(iFlytek)公司是中国领先的人工智能(AI)公司之一,而讯飞开放平台是该公司推出的一个开放的、面向开发者的平台,旨在提供各种语音和人工智能技术的API和SDK,以促进创新和应用的开发。1. 自然流畅:文字转语音技术通过模拟人类语音的音调、语速和语音韵律,生成具有自然流畅性的语音输出,使得听者能够获得良好的听觉体验。
2025-08-25 14:07:53
863
原创 JSON格式解析与构造技巧
如果输出结果没有问题,则可以开始对JSON数据进行解析,其中可以先从JSON对象中获得某个键的值,相当于对某个键值对进行解析,注意:如果键值对的值的类型不是字符串、整型、浮点型,则需要继续对键值对进行解析。来创建新的小对象,此时可以选择向小对象中添加键值对,添加键值对的前提是构造键值对,需要先把键值对的值添加到创建的对象中,再把小对象添加到其他对象中,具有嵌套关系。如果键值对的类型不是基本类型,而是对象或者数组,则需要继续解析,此时分为两种情况,第一种是情况:键值对的值的类型是对象,此时可以选择继续调用。
2025-08-24 20:38:11
794
原创 HTTP协议:从请求到响应的全过程
可以知道,HTTP协议的版本是由主版本号+次版本号组成的,最初的版本是HTTP/0.9,后期逐渐发展出其他版本,比如HTTP/1.0和目前最为主流的HTTP/1.1,但是还存在更高版本的HTTP协议。可以使用企业提供的天气API接口,比如比较知名的天气相关的API有心知天气,一般需要用户注册平台账号,然后进行个人认证、认证成功之后可以创建应用,得到应用对应的密钥,再通过密钥区访问API接口。当客户端接收到服务器的响应报文之后,可以根据响应报文中的状态码分析可能存在的问题并针对性解决。
2025-08-21 21:48:11
951
原创 套接字超时控制与服务器调度策略
因此在 TCP 中,当客户端发来连接请求、普通数据、数据回执,甚至是断开请求、断开请求的回执等等情况,都触发一样的信号,这就使得服务端光凭这一个信号无法知道下一步要做什么,因此信号驱动的服务器模型,一般只适用于UDP协议。对于TCP服务器而言,每当有一个远端的客户端发起连接成功后,服务端这边都会新增一个已连接套接字与之匹对,那么随着客户端连接的越来越多,服务端要处理的套接字也随之增多,如何同时妥善处理这些套接字成为必须解决的问题。如果只是处理网络套接字的数据,那么一般使用多线程。
2025-08-18 22:00:42
1218
原创 TCP协议:可靠传输与连接机制
不同网络的两台主机上的应用进程如果想要进行通信,就需要通过物理层、数据链路层、网络层这三层进行数据包转发,再通过传输层把数据包发送给主机中的指定进程,所以网络模型中的传输层至关重要。传输层中最为常见的两个协议分别是(Transmission Control Protocol)和UDP(User Datagram Protocol),想要掌握这两种协议,则需要阅读协议的标准文件,TCP标准内容如下:通过阅读RFC 793规范可以知道,TCP协议是面向连接的、可以实现端对端通信的可靠的协议。
2025-08-18 19:27:48
1025
原创 UDP协议特点与网络通信
包长度指的是UDP报首长度 + 数据内容长度之和,而包长度占16bit,也就是包长度的最大值是65535字节,可以看到UDP数据报报首的长度是8字节,而UDP协议接收到的网络层转发过来的数据包中还存在IP协议的报首,而IP协议的报首固定为20字节(不使用可选选项的情况下),所以UDP携带的数据内容的最大值是65507字节。可以看到,如果想要把主机IP加入到多播组中,需要使用一个名称叫做struct ip_mreqn的结构体,该结构体有3个成员,分别是多播组的IP地址、主机的IP地址、多播组接口索引。
2025-08-15 19:04:09
895
原创 Socket通信与IP地址分类
可以看到,IP协议标准中的数据报的组成部分中有4bit用于记录数据报的报首长度,但是单位是字(1个字等于32比特),而IP数据报分由固定报首和可选字段两部分组成,如果不设置可选字段,则固定报首的长度是20字节,也就是5个字,所以数据包报首的最小值是5(注意:单位是字!掌握了IP地址中的网络编号的规则之后,大家还需要了解一下IP地址中的本地地址的分配规则,本地地址的作用是标识处于某个网络中的唯一主机。另外,为了让不同的网络进行互联,就必须使用中继设备,和网络层相关的硬件设备就是路由器!
2025-08-14 13:48:01
624
原创 Linux线程调度策略与优先级
线程池指的是将线程放入一个类似缓冲区的池子中,对于生命周期很短的任务而言什么时候需要线程就从池子中捞出来干活,干完活就放回池子且让线程保持整装待命,并通过精巧的设计使得池子中的线程数量可以动态地发生变化,让线程既可以应对并发性需求,又不会浪费系统资源,这种设计思路就是线程池。第二个参数:inheritsched指的是线程的属性是打算继承创建该线程的线程的调度属性或者指定为线程属性对象attr中的调度属性,如果该参数为PTHREAD_EXPLICIT_SCHED,则表示线程的调度属性指定为attr的值。
2025-08-13 16:14:27
1187
原创 线程的同步与互斥
通过之前的学习,可以知道一个进程中可以存在多条线程,每条线程可以执行一个任务,而线程是并发执行的,这样可以提高程序的运行效率,但是系统分配资源是以进程为单位的,而进程中的所有线程会共享这些资源。思考:由于进程中创建出来的线程是并发执行的,也就是可能会出现线程之间抢占资源的情况,请问应该如何避免?回答:可以利用线程间的同步和互斥机制,来达到线程对资源的有序访问,同步指的是控制两个进度使之有先有后,次序可控,而互斥指的是控制两个进度使之互相排斥,不同时运行。
2025-08-11 20:11:03
962
原创 并发编程的原理与应用
线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。设计一个程序,要求在程序中创建两条子线程,主线程创建一个线程的属性对象,并对线程的属性对象进行初始化之后,要求创建的子线程的属性设置为分离属性,子线程A输出”hello”,子线程B输出”world”,主线程创建子线程之后就终止。通过上述学习,可以知道一个进程中可以存在多条线程,每条线程可以执行一个任务,而线程是并发执行的,这样可以提高程序的运行效率,但是系统分配资源是以进程为单位的,而进程中的所有线程会共享这些资源。
2025-08-06 17:46:33
771
原创 进程间通信方式—共享内存与信号量集
进程间通信(Inter process communication,简称IPC)指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
2025-08-04 15:52:44
757
原创 进程间通讯方式—消息队列
进程间通信(Inter process communication,简称IPC)指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
2025-08-04 14:23:26
870
原创 进程间通信方式-信号通信
进程间通信(Inter process communication,简称IPC)指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
2025-08-02 15:08:48
789
原创 进程间通信方式-管道通信
进程间通信(Inter Process Communication,简称IPC)指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
2025-07-31 15:31:51
758
原创 进程基础知识
程序只是开发人员为了实现某些需求设计出来的文本,是存储在计算机的磁盘中的,想要得到程序的运行结果,是需要使用编译器等工具对程序进行编译等一系列操作,目的是把程序转换为可执行文件,可执行文件内部其实就是对应平台可以识别的指令和数据的集合,可执行文件得到运行就是计算机的中央处理器CPU对可执行文件内部的指令进行处理,对可执行文件内部的数据进行运算的过程。通过这个函数,进程可以获取自身的 PID,方便在多进程环境中进行进程间通信、日志记录、资源管理等操作。不管是哪种情况,都应该及时回收进程占用的资源。
2025-07-30 21:58:50
715
原创 目录检索与并发编程
计算机一般是以数据块(Block)为单位访问数据,因为这样可以提高CPU的访问效率,而文件数据都存储在数据块中,所以为了能够方便找到数据块中存储数据的位置,就必须找到一个地方存储文件的属性(比如文件的字节数、文件的读写权限、文件的时间戳等),这种存储文件属性信息的区域叫做inode,中文翻译为索引节点,在Linux系统下inode其实是以结构体的形式来存储文件信息的,可以通过man手册的第7章了解inode,如 man 7 inode。函数成功返回一个指向该目录中下一个目录项的指针,失败返回NULL。
2025-07-29 10:50:15
937
原创 中文字库使用
注意:GB2312汉字库的汉字的具体位置和汉字本身大小是无关的,汉字的区码和位码来定位汉字在库的位置,一个汉字的占用字节的大小和汉字本身的分辨率 ,比如16*16大小的一个汉字,需要占用32字节。如果生成的是16*16的汉字库,则库中每个单元都是32字节。其实在linux系统和windows都是存储了汉字库,比如windows系统把汉字库文件都存储在C:\Windows\Fonts,在该路径下存储了很多的.ttf格式的字库文件,ttf格式是TureTypeFont的缩写,是TrueType类型文件。
2025-07-29 09:39:04
571
原创 动画显示原理
在Linux系统下连接操作系统的输入设备不止一种,可能是一个键盘、一个 USB 鼠标或者是一块触摸屏,甚至是一个游戏机摇杆,Linux在处理这些复杂多样的输入设备时,采用的办法就是用中间层来屏蔽各种细节,所以就设计出输入子系统(输入设备的集合)来管理这些输入设备。一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF......),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的,可以让用户看到画面是动态的。相对位移,比如鼠标的移动,滚轮的转动等。
2025-07-25 13:11:18
1057
原创 JPEG图像
由于libjpeg库不是直接安装在Linux系统下,这个libjpeg库是拷贝出来,所以在Linux系统路径下是找不到libjpeg的头文件和库文件的,所以在编译程序的时候需要使用编译器的选项: -I 指定头文件的路径 -L 指定库文件的路径 -l 指定库文件的名称(lib缩写)同样,JPEG也是一种常用的图像存储格式,JPEG的文件格式有两种文件扩展名:.jpg和.jpeg,这两种扩展名是相同的,我们可以把.jpg的文件改名为.jpeg,而对文件本身不会有任何影响。
2025-07-24 20:46:48
948
原创 内存映射与BMP图像原理
在这个过程当中我们进行了两次拷贝,数据传输的效率是比较低的。回答:计算机的CPU为了提高工作效率,所以读取数据的时候会进行字节对齐,一般图像刷新都是行为单位,所以CPU每次都是读取一行的大小,所以32bit系统下如果一行字节大小不是4的倍数,就会进行字节补齐,目的是提高效率,是典型的用空间来换时间的案例!由于BMP图像的每行都为四的倍数(以字节为单位),则宽度为10个像素(每个像素存储3个字节,RGB的信息)的图像,需要在每行的末尾进行补齐,计算可知此张图片需要两个字节,则在末尾补齐两个字节 00 00。
2025-07-23 16:45:12
653
原创 LCD屏幕
分别是ARGB,其中A指的是透明度,一般的LCD都不支持。在Linux系统中硬件设备主要分为两种:一种是字符设备(LCD、触摸屏、键盘......),另一种是块设备(硬盘、U盘......),这两种类型的硬件设备都需要由驱动程序(xxx.ko)控制,当驱动程序安装完成后会自动生成硬件的设备文件,用户才可以通过设备文件去访问硬件。请求码是通过宏定义的方式写入到硬件的驱动程序中,当驱动安装成功后,用户就可以通过头文件中的请求码向内核中的驱动程序发出请求,然后内核通过请求码去访问硬件,再把访问结果返回给用户。
2025-07-22 21:24:21
1564
原创 文件的IO
回答:用户调用fopen打开文件之后,可以把数据写入到文件中以及从文件中读取数据,但是实现读取和写入的过程中其实内核并没有直接操作文件,而是在操作指向文件的结构体指针FILE,也就是用户写入的数据和读取的数据会先存储在FILE结构体的。总而言之,Linux内核离开根文件系统是无法正常工作的。如果计算机只有硬件系统,那么计算机是无法正常工作的,因为计算机是由基本的电子元件组成的,而电子元件的状态是需要由软件来控制的,所以计算机必须要搭载软件系统,计算机的软件系统与硬件系统是互相依赖的。
2025-07-16 21:32:26
729
原创 数据结构:排序算法
比如上图中四位小朋友打算排队坐车,此时小雷、小明、小亮、小美已经排好队,此时老师发现队列不整齐,老师观察到小明的身高最低,所以要求小明排在队伍的第一位,所以小雷和小明的位置互换一下,然后老师发现剩下的队伍中小亮的身高最低,所以小亮和队伍的第二位的位置互换一下,然后老师又发现剩下的队伍中小美的身高最低,所以小美和队伍的第三位的位置互换一下,这样n轮排序后,就可以让整个队伍变得有序。然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换数字,直到它到达整个序列的最左边为止。
2025-07-15 21:16:01
325
原创 数据结构:二叉树
树中的数据元素之间的逻辑关系是一对多的。,双分支结点指的是就是度为2的结点,假设二叉树的叶子结点数量为n0,二叉树中单分支结点的数量为n1,二叉树中双分支结点的数量为n2,则二叉树中结点的总数 = n0 + n1 + n2。可以看到,上图二叉查找树中叶子结点的数量为3,度为1的结点的数量为1,度为2的结点数量为2,所以该二叉查找树的结点总数为6,和图中结点数量一致。可以看到,结点A有2个子结点,分别是B和H,所以子树B和子树H的双亲就是结点A,同理,结点B和H就是结点A的孩子,并且结点B和H是兄弟。
2025-07-14 16:36:15
782
原创 数据结构:队列
数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。如果以数组为基础,一般会把队列设置为循环队列,循环队列也被称为“环形缓冲区”,因为如果队列中的元素出队,则需要把该元素的后继元素整体向前移动,这是时间复杂度为O(n)的操作。
2025-07-09 10:24:42
829
原创 数据结构:栈
要解决这个问题,我们需要根据栈“后进先出”的特点,分析以d开头的出栈序列的可能情况。`d` 出栈后,后续出栈顺序由剩下元素(`a`、`b`、`c` 在栈内,`e` 未进栈 )决定,`e` 可以在任意时刻进栈再出栈,具体可能的序列为: - `d c b a e` - `d c b e a` - `d c e b a` - `d e c b a` 所以以 `d` 开头的出栈序列有 4 种,答案选 B。只不过栈是一种特殊的线性表,特殊在栈的一端是封闭的,数据的插入与删除只能在栈的另一端进行,也就是栈遵循“
2025-07-03 11:00:39
819
原创 双向循环链表
双向循环链表与双向链表的区别:指的是双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向循环的链表。创建一个空链表,由于是使用头结点,所以就需要申请头结点的堆内存并初始化即可!双向循环链表的原理与应用。
2025-07-02 20:34:55
348
原创 单向循环链表与双向链表
在顺序表最后进行插入和删除运算时,若不涉及扩容等操作 ,插入和删除的时间复杂度也较低,插入平均时间复杂度为 O(1)(不考虑扩容) ,删除平均时间复杂度为 O(1)(不考虑元素移动后的整理等额外操作),所以顺序表能满足最常用操作的高效需求。:在双链表中,删除第一个元素时间复杂度为 O(1),但在最后一个元素之后插入元素,需要遍历链表找到尾节点(虽然可以从表头或表尾双向遍历,但仍需一定时间),时间复杂度为 O(n) ,不是最节省时间的。删除第一个元素时,可通过尾指针找到第一个元素(尾指针的。
2025-05-27 21:04:04
721
原创 数据结构单向链表
回答:由于链表中的每个数据元素的地址是不固定的,所以每个数据元素都应该使用一个指针指向直接后继的内存地址,当然最后一个数据元素没有直接后继,所以最后一个数据元素指向NULL即可,作为用户只需要知道第一个数据元素的内存地址,就可以访问后继元素了。顺序表的缺点是:顺序表的数据在进行增删的时候,需要移动成片的内存,另外,当数据元素的数量较多的时候,需要申请一块较大的连续的内存,同时当数据元素的数量的改变比较剧烈,顺序表不灵活。可以看到,顺序表和链式表的区别:顺序表使用连续的内存,链式表使用离散的内存空间。
2025-05-25 17:05:50
1078
原创 数据结构概述与顺序表
数据结构指的是计算机存储数据和组织数据的方式,存储数据和组织数据的目的是为了后期对数据的再次利用,所以存储的数据一般是具有一个或者多个特定关系的集合,利用不同的数据结构可以提高数据的访问效率。思考:为什么大家来到新教室选好座位之后需要填写座位表??答案:方便管理班级学生数据指的是可以被输入到计算机并且可以被计算机处理的符号的总称,数据的英文是Data。
2025-05-23 18:37:35
1056
原创 Linux基础第五天
集成开发工具使用MobaXterm工具如果开发项目时使用较多的开发软件,则会导致拖慢项目进度以及降低项目的开发效率,所以为了提高开发效率,需要优化开发工具,最好能使用一款工具完成所有的操作。比如可以把vmware虚拟机、secureCRT软件、tftp工具进行合并,也就是用一个软件来代替这三款软件,所以可以选择使用MobaXterm工具。该软件是基于强大的X服务和ssh客户端,MobaXterm成为远程计算的终极工具箱。在单个Windows应用程序中,它提供了大量功能,这些功能是为程序员,网站管理员,IT管
2025-05-20 19:38:24
921
原创 Linux基础第四天
想要实现两个不同的系统之间实现文件共享,最简单的一种方案就是设置VMware软件的共享文件夹,利用共享文件夹可以实现linux系统和windows系统之间的文件共享,这样就可以实现在windows系统上编辑程序,然后在linux系统下编译程序以及运行程序,尤其是当使用开发板的时候,这种方案非常好用。由于开发板的硬件平台是ARM,但是开发板并不具备编译程序的能力,所以需要在计算机中的linux系统对程序进行编译。设置主机路径(windows系统的路径,),设置名称(linux系统的文件夹的名称,英文)
2025-05-19 22:10:09
386
原创 Linux基础第三天
在查找过程中需要注意的是,要查找的字符串是严格区分大小写的,如查找 "shenchao" 和 "ShenChao" 会得到不同的结果。需要注意:vi/vim 的保存和退出是在编辑模式中进行的,"w!:文件的基本信息都存储在inode中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的inode,从而读取该文件的数据信息。tar命令,该命令的作用是归档/释放 以及 压缩/解压,归档的意思把文件统一打包但不作压缩处理,所以压缩和归档生成的包的大小不同。
2025-05-18 22:12:33
794
原创 Linux基础第二天
其实就是Linux系统提供给用户和内核进行交互的一个程序,该程序能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,所以需要用户掌握对应的shell命令才能控制Linux系统内核。rm 命令,是英文remove的缩写,在Linux系统中是强大的删除命令,它可以永久性地删除文件系统中指定的文件或目录。在Linux系统中,用户可以分为超级用户(也被称为root用户,拥有系统的最高权限,可以执行任何命令和操作)、普通用户(没有超级用户的权限,只能访问和修改自己的文件和目录)。
2025-05-17 21:25:17
738
原创 Linux基础第一天
因此拿到源码的开发者经过定制、裁剪,使得Linux可以适应任何硬件平台,所以我们看到Linux的适用领域非常宽广,从个人穿戴设备、到工业控制,从家用电视机电盒、智能路由到企业智能设备,从汽车娱乐系统、到大型服务器集群,几乎所有带智能的电子设备都可以看到Linux的身影。虚拟机软件是使用计算机硬件资源的。系统进行Linux学习,ubuntu系统是由Debian发行版发展而来,界面友好,方便开发,并且ubuntu系统的每个版本都可以免费下载,用户可以去ubuntu官网下载对应的镜像文件安装到自己的主机上。
2025-05-16 20:58:38
693
原创 C语言第十五天
注意:宏定义的作用域是针对整个文件有效,所以应该定义在源文件的开头部分,这样才可以在其他的函数中使用宏定义,另外,宏不是语句,所以不需要在末尾添加分号,如果添加分号,则分号也会被一起替换。可以发现,带参数的宏和函数的形式很像,但是却完全不同,带参数的宏会在程序所有出现的位置进行展开,缺点是浪费了内存空间,但是节约了函数切换的时间。预处理指令就是在程序编译之前由预处理器把包含的头文件中的代码拷贝一份到源文件对应的位置,如果包含的文件中还有其他的预处理指令,会递归执行!
2025-05-14 21:46:47
514
原创 C语言第十四天
注意:联合体变量中的成员由于是共用一块内存,所以每个成员的起始地址都是相同的,只要修改联合体中任何一个成员的值,都会影响其他成员的值,另外,也不应该同时对联合体中的多个成员进行赋值。回答:当然是有的,为了方便用户传递数据,所以C语言标准中提供一种数据类型叫做结构体,也被称为用户自定义数据类型或者复杂数据类型,指的是用户有权利在程序中设计一种新的类型。的关键字,用于构造联合体类型,联合体也被称为共用体,指的是联合体中的各个成员是共用一块内存空间,所以联合体的内存空间就是以成员中数据宽度最大的那个成员为主。
2025-05-13 19:53:00
744
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅