原创 C++:jieba库的安装使用保姆级教程
本文介绍了C++版中文分词库Jieba的安装与使用方法。主要内容包括:1)通过git克隆cppjieba项目;2)初始化并下载依赖子模块limonp;3)使用cmake和make编译生成可用库;4)测试验证库功能。最后给出了基础使用示例代码,展示如何加载词典文件并创建Jieba对象进行中文分词。文章针对初学者可能遇到的安装问题提供了详细步骤说明,帮助用户快速搭建中文分词环境。
2025-10-19 17:03:23
719
原创 MySQL:表的约束
SQL表的约束是保证数据完整性和一致性的重要规则。主要约束包括: 非空约束(NOT NULL)确保字段不为空 唯一约束(UNIQUE)保证字段值不重复 主键约束(PRIMARY KEY)作为唯一标识符,兼具NOT NULL和UNIQUE特性 默认值(DEFAULT)为未指定值的字段提供默认数据 外键(FOREIGN KEY)建立表间关联,确保引用完整性 检查约束(CHECK)在MySQL8.0+中用于验证数据条件 这些约束在创建表时定义或后期添加,能有效防止无效数据进入数据库,维护数据质量。外键约束特别重要
2025-10-05 10:24:23
798
原创 MySQL:CRUD
MySQL表的增删改查(CRUD)操作指南 本文介绍了MySQL数据库中对表进行增删改查的基本操作。主要内容包括: 新增(Create):讲解了单行插入和多行插入语法,以及字符编码问题对插入数据的影响。 查询(Retrieve):详细介绍了: 指定列查询 使用DISTINCT去重 通过ORDER BY进行排序 条件查询(WHERE子句) 分页查询 注意事项:强调了在业务代码中直接查询全表的危险性,以及如何通过条件查询限制结果集。 文章通过大量示例代码和截图演示了各种SQL语句的使用方法,适合MySQL初学者
2025-10-04 15:02:04
774
原创 MySQL:库操作和常用数据类型
本文介绍了MySQL 8.0.33中数据库和数据类型的基本操作。主要内容包括: 数据库操作:展示如何查找、创建、删除和修改数据库; 数据类型详解: 数值类型:TINYINT、INT、BIGINT等及其适用场景; 字符串类型:CHAR、VARCHAR、TEXT等存储文本数据的方法; 日期时间类型:DATE、DATETIME、TIMESTAMP等时间数据的处理方式。 每个操作都配有示例代码和执行结果截图,便于理解。文章适合MySQL初学者快速掌握数据库基础操作和数据类型选择。
2025-09-21 23:39:56
630
原创 Linux网络:HTTPS协议
数据签名:证书的“防伪章”,用哈希(SHA-256)+ 私钥加密,确保证书没被改,像包裹上的封条,浏览器用CA公钥检查。CA 认证:可信机构签发证书,证明网站身份真实,像公安局发的身份证,浏览器用CA公钥验证。HTTPS 里的作用:签名确保证书可信,CA认证确认网站身份,共同建立安全通信。
2025-09-19 21:39:00
979
原创 Linux网络:守护进程
Linux守护进程简介 守护进程是Linux系统中在后台运行的特殊程序,不直接与用户交互,系统启动时自动运行直至关机。它们脱离终端控制,适合长期运行的服务。 核心概念 会话:一组相关进程的集合,与终端绑定,会话领导者(如bash)负责终端通信 进程组:多个协同工作的进程集合,共享同一个PGID 区别:会话包含多个进程组,进程组包含多个进程 创建方法 setsid():底层系统调用,创建新会话并脱离终端控制 daemon():封装好的库函数,自动完成会话创建、目录切换等操作 守护进程通过脱离终端会话,确保服务
2025-09-16 21:18:09
779
1
原创 Linux网络:序列化和反序列化
摘要 本文通过自行车拆装比喻,生动解释了序列化和反序列化概念。序列化是将内存中的结构化数据(如游戏角色对象)转换为便于传输/存储的字节流(如JSON格式),类似拆卸打包自行车;反序列化则是按相同规则将字节流重建为原始数据结构,如同拆箱组装。文章演示了C++中使用jsoncpp库进行序列化(构建嵌套JSON对象)和反序列化(解析JSON字符串)的具体代码实现,包括数组、嵌套对象处理及错误捕获机制,并强调该过程对网络通信(如socket编程)中数据结构传输的关键作用。
2025-09-15 20:51:51
890
原创 Linux网络:socket编程TCP
本文介绍了TCP通信的基本流程,包括服务器端和客户端的实现步骤。服务器端通过socket创建套接字、绑定IP和端口、监听连接请求、接收连接并进行数据收发,最后关闭连接。客户端同样创建套接字后,指定服务器地址和端口,连接服务器并发送消息。文中详细说明了关键系统调用的作用,如listen()、accept()、connect()等,并解释了TCP三次握手和四次挥手的过程。示例代码展示了完整的TCP通信实现,突出了服务器和客户端各自的核心操作流程。
2025-09-15 10:52:19
675
原创 Linux网络:socket编程UDP
Socket编程核心要点 Socket是操作系统提供的网络通信机制,本质是特殊的文件描述符,用于进程间数据交换。 服务端流程:创建socket→绑定IP/端口→接收数据→回复→关闭。关键函数:socket()、bind()、recvfrom()/sendto()。 客户端关键:通过目标IP(如127.0.0.1)和端口号(如12345)定位服务端,使用相同协议族(如AF_INET)进行通信。 注意事项:需处理字节序转换(htons)、地址结构体(sockaddr_in),及时关闭socket避免资源泄漏。
2025-09-14 15:02:29
883
原创 Linux系统:线程池
线程池就像一个“工人队伍”,提前雇好几个工人(线程),让他们随时待命。每个任务来时,不用临时招人(创建新线程),直接让闲着的工人去干活复用线程。干完后,工人不走,继续等下一个任务。线程池的应用场景线程池最适合那些需要“同时干多件事,但任务短小精悍”的地方。简单说,它像一个“待命工人队”,帮你高效处理并发任务。Web服务器处理请求:比如网站收到很多用户访问(如淘宝浏览商品),每个请求是短任务,用线程池分配“工人”快速响应,避免服务器卡顿。文件上传/下载。
2025-09-14 12:13:12
760
2
原创 Linux系统:日志系统
本文介绍了一个基于C++的线程安全日志系统,采用策略模式支持终端和文件两种日志输出方式。系统自动记录时间戳、日志等级、进程号、源文件及行号等信息,用户只需通过LOG(level) << "消息"格式即可记录日志。关键实现包括:1) 定义LogStrategy抽象基类,派生出终端输出(ConsoleLogStrategy)和文件输出(FileLogStrategy)子类;2) 建立日志等级枚举类型(DEBUG/INFO/WARNING等)及转换函数;3) 实现时间戳获取功能。系
2025-09-13 11:31:06
655
1
原创 Linux网络:基于OS网络基础架构
本文介绍了计算机网络的基础概念,包括局域网(LAN)和广域网(WAN)的区别与联系,OSI七层模型及其与操作系统的关系,以及TCP/IP协议、MAC地址等核心知识点。文章还详细讲解了Linux系统中ifconfig命令的使用方法,帮助读者理解网络接口配置和状态信息。通过理论结合实践的方式,帮助开发者掌握网络通信的基本原理,为开发联网应用奠定基础。
2025-09-10 11:37:01
921
原创 Linux系统:线程同步与生产消费模型
文章摘要: 线程同步通过互斥锁和条件变量实现多线程环境下的有序协作。条件变量(pthread_cond_t)与互斥锁配合,解决线程等待特定条件的场景(如生产者-消费者模型)。生产者线程在缓冲区满时等待,消费者线程在空时等待,通过pthread_cond_signal唤醒对方。初始化条件变量可采用静态(PTHREAD_COND_INITIALIZER)或动态(pthread_cond_init)方式。生产者-消费者模型通过缓冲区解耦生产与消费,利用互斥锁保证操作原子性,条件变量实现同步,从而解决速度不匹配问题
2025-09-08 23:49:57
672
原创 Linux系统:线程的互斥和安全
摘要: 本文探讨了线程互斥在多线程编程中的重要性。通过模拟多线程抢票案例,展示了共享资源(全局变量)因线程竞争导致的错误结果(如票数为负)。问题根源在于if判断和--操作的非原子性,导致线程切换时数据不一致。解决方案是引入互斥锁(pthread_mutex_t),确保临界区代码(操作共享资源的部分)仅由一个线程执行。示例代码演示了静态初始化的全局锁如何保证数据正确性,并对比了无锁与加锁情况下的输出差异。此外,还简要介绍了互斥锁的静态初始化和动态初始化两种方式及其适用场景。互斥机制有效避免了竞态条件,确保多线
2025-09-08 22:03:05
1391
原创 Linux系统:线程的概念和控制
本文主要介绍了线程的概念、优缺点及其控制方法。线程作为进程内部的执行单元,允许多个任务并发执行,共享同一进程的内存和资源,具有轻量级、高效的优势。相比进程,线程更节省系统资源,能更好利用多核CPU,但同时也存在稳定性、访问控制和编程复杂度等挑战。文章详细讲解了POSIX线程库的使用,包括线程创建、线程ID类型及线程终止方法,并通过C语言代码示例演示了线程的基本操作。掌握线程技术有助于提升程序性能和响应速度,为并发编程和服务器开发奠定基础。
2025-09-05 00:15:00
820
4
原创 Linux系统:进程信号的处理
本文深入讲解了Linux进程信号处理机制,重点分析了信号在task_struct中的存储结构(pending、block和handler表)。信号处理流程涉及三个关键数据结构:Handler表(存储信号处理动作)、Block位图(标识阻塞信号)和Pending位图(暂存待处理信号)。文章详细介绍了sigset_t类型及其操作函数(sigemptyset/sigfillset等),并通过sigprocmask函数演示了如何修改信号屏蔽字。示例代码展示了阻塞SIGINT信号的效果,验证了信号
2025-09-02 23:44:40
822
原创 Linux系统:进程信号的产生
本文介绍了Linux进程信号的基本概念和作用。信号是软件层面的中断机制,用于进程间异步通信和控制,包括终止进程(Ctrl+C)、事件通知和错误处理等。文章详细讲解了信号的定义、分类(标准信号1-31和实时信号34-64)、产生方式(键盘输入和kill命令),并通过代码示例展示了如何使用signal函数自定义信号处理函数。信号机制使程序能够响应外部事件,是编写健壮系统程序的重要基础。
2025-08-28 11:49:26
744
原创 Linux系统:管道通信
Linux系统中的管道(pipe)是一种基础进程间通信方式,分为匿名管道和命名管道。匿名管道通过pipe()创建,仅限有亲缘关系的进程使用,采用半双工单向通信,默认阻塞读写。命名管道(FIFO)通过mkfifo创建文件系统路径,允许无关进程通信,遵循与匿名管道类似的读写规则。两者核心区别在于创建方式,但均依赖内核协调数据传输,具有生产者-消费者模型特性,适用于不同场景的进程协作需求。
2025-08-20 17:09:06
657
原创 Linux系统:库的制作
Linux库是预先编写好的可复用代码集合,分为静态库(.a)和动态库(.so)。静态库在编译时直接打包进可执行文件,而动态库在运行时加载。常见库如libc(标准C库)和libstdc++(C++标准库)分别提供基础功能。文章通过示例展示了如何制作简单的静态库:编写头文件(.h)声明函数,源文件(.c)实现功能,使用ar命令将目标文件(.o)打包为.a文件。库的开发能提高代码复用性,减少程序体积,加快编译速度,是Linux程序开发的重要基础。
2025-08-13 13:43:20
808
原创 Linux系统:Ext系列文件系统(软件篇)
摘要 本文深入解析了ext2文件系统的核心结构与工作原理。ext2将硬盘分区划分为多个块组(Block Group),每个块组包含超级块、组描述符表、块位图、inode位图、inode表和数据块等关键组件。超级块记录文件系统全局信息并在各块组备份以提高容错性;块组描述符表管理块组属性;位图系统跟踪资源使用状态;inode表存储文件元数据并通过多级索引实现数据块映射。文件创建过程需分配inode和数据块,并更新相应位图结构。这种设计既保证了文件系统的可靠性,又实现了高效的文件管理能力。
2025-08-08 17:20:38
1061
原创 Linux系统:Ext系列文件系统(硬件篇)
本文介绍了Linux系统中Ext文件系统的硬件基础——磁盘的物理与逻辑结构。主要内容包括: 硬件层级关系:磁盘作为服务器的一部分,服务器置于机柜中,多个机柜组成机房。 磁盘的物理结构:包括盘片、主轴、磁头、永磁铁和磁头臂等核心组件,通过磁化原理存储数据。 存储结构:详细说明扇区、磁道、柱面等概念,以及传统的CHS寻址方式及其容量限制(约8.4GB)。 逻辑结构:将磁盘抽象为线性结构,引入LBA(逻辑块地址)作为现代寻址方式,替代了CHS的限制。 地址转换:解释了CHS到LBA的转换公式,实现物理到逻辑地址的
2025-08-08 17:18:30
1012
原创 Linux系统:基础I/O
学习Linux的基础I/O可以让我们理解文件本质,提高系统操作能力, 写出高质量的 C/C++ 系统程序,理解命令工具背后的机制,系统调优 & 性能优化,开发脚本、工具、守护进程的基础能力,为后续高级知识打基础,Linux 的基础 I/O 是“系统之眼”,是你进入操作系统底层世界的钥匙。pathname:要打开或创建的目标文件路径flags:文件打开方式,可以使用以下常量之一或多个进行按位“或”运算()组合:O_RDONLY:只读方式打开文件O_WRONLY:只写方式打开文件O_RDWR。
2025-08-05 21:44:27
974
原创 Vue3:路由基础
我们来看一个网易云的页面在这里有两个关键,一个是切换页面的按钮,还有一个是网页的地址当我们在发现音乐和我的音乐和关注,之间互相切换的时候,观察网页地址的变化当我们点击按钮改变页面的时候,并不会直接换一个HTML页面,而是在HTML页面中更换组件,下面的页面内容都对应一个Vue组件,每次切换都会更换Vue组件那为什么不直接用v-if呢URL 不变,用户无法分享链接浏览器后退/前进按钮失效代码难维护和扩展。
2025-07-10 19:13:56
566
原创 Vue3常用指令
Vue 3 中的指令是带有v-前缀的特殊属性,用于在 DOM 元素上应用特殊的响应式行为。指令的主要作用是当其表达式的值改变时,将某些行为响应式地应用到 DOM 上。
2025-07-09 18:35:17
829
1
原创 Javascript:WebAPI
<style></style></head><body></body><script></script></html>演示结果这就是我们创建的节点但是网页并不会输出什么将节点存放在一个容器中再输出到网页<head><style></style>
2025-05-18 00:04:29
899
原创 Vue3:脚手架
这里我已经安装过了,只需要打开链接直接下载nodejs,安装直接一直下一步下一步安装完成之后我们来使用电脑的命令行窗口检查一下版本查看npm源这里npm源的地址是淘宝的源,不是官方源,因为我之前已经改了,当我们获取源数据时会从外国的源里面获取,这里我们更换一下获取源的位置这里我们将获取源数据的位置更改了比如yarn和pnpm检测是否安装成功。
2025-05-16 21:16:17
2476
1
原创 Vue3:声明式渲染
我们来用Vue的方式实现一个Hello,World其中的mount是挂载,将渲染数据挂载到某个容器中setup函数是Vue3的入口,后续的Vue3的代码都会在这里编写插值是{{message}}表示将数据在此标签中的渲染效果表示出来。
2025-05-16 11:19:02
309
原创 Javascript基础语法
let a=15;let b=3.14;let d=true;</script>在控制台中查询演示结果这里分别对应这五种变量的属性当变量设置了但是没有定义,那么它的类型就是undefined演示代码<script>let a;!!");
2025-05-11 14:54:22
1059
原创 CSS:弹性布局
弹性布局是CSS3中一种现代的布局模式,专门用于设计一维布局(行或列)。它提供了更有效的方式来分配容器内项目的空间和对齐方式,即使项目的大小未知或动态变化。
2025-05-10 13:41:29
523
原创 CSS:元素显示模式与背景
元素显示模式是指元素在浏览器页面中显示的模式,比如<div></div>是独占一行的块级元素,<span></span>是行内元素。
2025-05-08 23:54:23
938
1
原创 CSS: 选择器与三大特性
标签选择器标签选择器就是选择一些HTML的不同标签,由于它们的标签需求不同,所以CSS需要设置标签去选择它们,为满足它们的需求给予对应的属性。
2025-05-08 11:47:32
841
原创 C语言:文件操作
文件是计算机用于存储数据的工具,我们计算机磁盘上的数据是混乱的,但是我们计算机系统通过文件的方式记录数据在磁盘上的位置来将数据整齐划分。
2025-05-04 21:25:08
809
原创 linux:进程的替换
当我们使用fork时,会创建一个子进程来给我们执行代码,但是子进程执行的也是父进程的代码,我们再写代码的时候,往往是需要执行其它代码,所以当其它程序的代码替换到自己的程序中执行,这种行为叫,进程的替换使用进程的替换我们往往需要使用exec类型函数来进行让我们来查看一下exec的类型函数有哪些exec函数有六种,让我们来分别讲解用途。
2025-04-27 23:37:28
1093
原创 Linux:进程的等待
当以一个进程结束时,它会变成僵尸进程,这个僵尸进程如果不处理,就会一直占用CPU资源,如果父进程要回收这个进程会通过进程等待的方式处理,回收子进程只会,会得到进程的退出信息。
2025-04-25 21:44:24
788
原创 Linux:进程的创建&&进程的终止
fork是c语言中的一个函数,用于创建新的子进程,它存放在<unistd.h>的头文件中当我们运行程序时,如果使用了fork函数那么就会为这个进程创建一个它的子进程,这个子进程会继承父进程的所有数据和代码,但其实子进程是和父进程共用一套数据和代码。还有一个重点是:内存指针子进程会继承父进程的内存指针,内存指针用于指向程序执行到了哪里。我们来测试一下fork是否真的会创建一个新的进程。我们来看以下代码运行结果我们可以看到,在fork之前的程序只运行了一次,但是在fork之后的语句运行了两次,
2025-04-24 22:43:35
859
1
RSS订阅