- 博客(77)
- 收藏
- 关注
原创 MySQL 表的操作
本文介绍了数据库表的基本操作,包括创建、查看、修改和删除表。创建表时,需指定表名、字段名、数据类型、字符集、校验规则和存储引擎。查看表可以通过show tables查看当前数据库的表,或使用desc和show create table查看表结构和创建语句。修改表包括重命名表名、修改列名称及属性、增加字段、修改字段属性和删除字段,使用alter table语句实现。删除表使用drop table语句,可删除指定表及其数据。这些操作为数据库表的管理提供了全面的指导。
2025-05-22 00:13:21
533
原创 Linux 的 TCP 网络编程 -- 回显服务器,翻译服务器
本文介绍了TCP网络编程中的关键函数及其应用,包括listen()、accept()和connect(),并详细描述了如何实现TCP回显服务器和TCP翻译服务器。listen()用于将套接字设置为监听状态,accept()用于接受客户端连接,connect()用于客户端发起连接请求。文章还展示了如何通过多线程和线程池技术处理客户端请求,并提供了代码示例和测试方法。TCP回显服务器通过线程池处理客户端请求,而TCP翻译服务器则通过多线程技术实现英文到中文的翻译功能。
2025-05-20 14:36:31
945
原创 MySQL 库的操作 -- 字符集和校验规则,库的增删查改,数据库的备份和还原
本文主要介绍了数据库中的字符集和校验规则,以及数据库的基本操作、备份和恢复方法。字符集决定了数据的编码方式,而校验规则影响数据的读取和比较,如大小写敏感性。文章详细说明了如何查看和设置字符集及校验规则,并提供了创建、查看、删除和修改数据库的SQL语法和示例。此外,还介绍了使用mysqldump命令进行数据库备份和恢复的步骤,以及如何查看当前数据库的连接情况。这些操作对于数据库管理和维护至关重要。
2025-05-20 12:55:39
629
原创 MySQL数据库基础 -- SQL 语句的分类,存储引擎
本文介绍了数据库的基本概念和使用方法,重点围绕MySQL展开。首先解释了数据库的定义,指出MySQL是一个基于客户端-服务器模式的网络服务,能够高效管理数据。接着详细说明了如何进入MySQL、理解服务器、数据库和表之间的关系,并通过案例展示了数据库的创建和使用过程。此外,文章还介绍了SQL语句的分类,包括数据定义语言(DDL)、数据操纵语言(DML)和数据控制语言(DCL)。最后,讨论了MySQL的存储引擎,如何查看不同引擎以及常用引擎的对比。本文为初学者提供了MySQL数据库的入门指南。
2025-05-19 22:09:29
918
1
原创 Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
本文介绍了如何使用C++实现一个回显服务器(Echo Server)和翻译服务器(Translation Server)。回显服务器的功能是接收客户端发送的消息并将其回显到客户端显示器上。文章首先介绍了互斥锁的封装模块和线程安全的日志模块,接着详细讲解了UDP服务端的封装,包括socket()、bind()、recvfrom()、sendto()等关键函数的用法。此外,文章还提供了服务端和客户端的代码实现,并演示了本地和跨网络的通信过程。最后,文章介绍了如何将回显服务器扩展为翻译服务器,通过加载字典文件实现
2025-05-17 17:17:54
921
原创 Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序
协议本质就是一种约定。网络协议是指为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议的作用:如同人类社会中的交通规则或语言规范,网络协议确保了不同设备之间能够准确、高效地进行数据通信。它规定了数据的格式、传输顺序、错误处理方式以及通信双方如何进行交互等内容,使得各种计算机设备和网络系统能够相互理解和协同工作。
2025-05-11 18:37:16
935
1
原创 多线程编程的常见问题
线程安全:线程安全是指在多线程环境下,一个函数或者一段代码可以被多个线程同时调用,并且能够正确地处理共享资源,不会因为多线程的并发执行而产生数据竞争、不一致或者其他未定义行为。 可重入函数:可重入函数是指一个函数可以被多个线程或者同一个线程在不同的执行上下文中安全地调用,即使在函数执行过程中被中断并再次被调用,也不会出现数据混乱或者其他错误。可重入函数不依赖于任何静态或全局的非常量数据,也不修改任何静态或全局的非常量数据,所有数据都由函数的调用者提供。 可重入性与线程安全的联系:
2025-05-02 13:51:23
469
原创 Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
由于实现的日志系统要支持多线程程序日志的有序打印,所以不管在访问显示器还是访问文件的时候都需要通过加锁来维护线程之间的互斥关系。// 将互斥量接口封装成面向对象的形式public:Mutex()(void)n;(void)n;(void)n;
2025-04-27 17:06:45
725
原创 线程同步与互斥 -- 互斥锁,线程同步,条件变量,生产者消费者模型,POSIX信号量
1. 初始化互斥量,初始化方法有两种:方法1:静态分配全局互斥量使用宏 PTHREAD_MUTEX_INITIALIZER 初始化全局的锁。不需要进行释放,程序运行结束会自动释放申请的资源。方法2:动态分配参数:mutex:要初始化的互斥量attr:设置锁的属性,默认情况为 NULL使用动态分配的方式初始化锁,需要调用 pthread_mutex_destroy 进行销毁。2. 销毁互斥量使用 PTHREAD_MUTEX_INITIALIZER 初始化的互斥量不需要销毁;
2025-04-24 16:31:10
878
原创 Linux中线程的概念与控制 -- 线程概念,页表,线程与进程,线程控制,C++封装线程
现在给出一个虚拟地址,第一次查页目录表,确定在哪个页表中,第二次查页表,确定在哪个页框中,第三次通过页框的起始地址加上页内偏移量,就可以获得一个物理地址了。以上其实就是 MMU 的工作流程。MMU(Memory Manage Unit)是一种硬件电路,其速度很快,主要工作是进行内存管理,地址转换只是它承接的业务之一。
2025-04-13 13:51:00
820
原创 Linux的进程信号 -- 信号产生,信号保存,信号捕捉,硬件中断,内核态和用户态,可重入函数,volatile,SIGCHLD
信号是进程之间事件异步通知的⼀种方式,属于软中断。基本结论:1. 进程在信号还没有产生的时候,早就知道信号该如何处理了。2. 信号的处理不是立即进行处理的,而是在合适的时候进行处理的。3. 操作系统在被设计的时候,就早已经内置了进程对于信号的识别和处理方式。4. 产生信号的信号源是非常多的。
2025-03-25 15:15:52
1027
原创 进程间通信(Inter-Process Communication,IPC) -- 匿名管道,命名管道,System V,共享内存,消息队列,信号量
1.:⼀个进程需要将它的数据发送给另⼀个进程。2.:多个进程之间共享同样的资源。3.:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。4.:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。
2025-03-13 14:43:15
946
原创 C/C++动静态库的制作与原理 -- 静态库,动态库,目标文件,ELF文件,动态链接,静态链接
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库:.a文件 [Linux],.lib文件 [windows]动态库:.so文件 [Linux],.dll文件 [windows]1. 静态链接提⾼了程序的模块化⽔平。对于⼀个⼤的项⽬,不同的⼈可以独⽴地测试和开发⾃⼰的模块。
2025-02-26 14:39:49
1085
原创 Ext系列文件系统 -- 磁盘结构,磁盘分区,inode,ext文件系统,软硬链接
一个进程PCB中,fs_struct中存储根目录和当前文件的当前目录的信息,file_struct中有一个文件描述符表,其中是该进程打开的文件,文件描述符表中的指针指向每个被打开文件的files结构体,在files结构体中有存储该文件的操作方式结构体files_operations,用f_op指针指向。dentry_operations和inode_operations同理。
2025-02-20 16:41:18
863
原创 Linux中的基础IO -- C语言文件操作,系统级文件操作(open, write, read),文件描述符,重定向,dup2,缓冲区机制
pathname:要打开或创建的目标文件路径。flags:打开文件时,可以传⼊多个参数选项,这里就是使用位图的方式来传递标志位,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。O_RDONLY:只读打开。O_WRONLY:只写打开。O_RDWR:读,写打开。这三个常量,必须指定⼀个且只能指定⼀个。O_CREAT:若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限。O_APPEND:追加写。mode:指定创建文件时的默认权限。
2025-02-13 16:47:58
1094
原创 进程控制 -- 进程创建(fork),进程终止(exit, _exit),进程等待(wait, waitpid),进程程序替换(exec*系列函数)
execl函数,需要传递程序的路径,并且使用列表形式传递命令行参数。int main()printf("我的程序要运行了!\n");sleep(1);exit(1);printf("我的程序运行完毕!\n");return 0;
2025-01-04 12:46:46
599
原创 虚拟地址空间 -- 虚拟地址,虚拟内存管理
虚拟地址空间本质就是一个结构体对象,名为mm_struct(内存描述符),描述Linux下进程地址空间的所有信息。每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个指向该进程mm_struct的指针。mm_struct结构体中存储的是对进程地址空间中代码区、堆区、栈区等每个区域进行区域划分的信息,存储的是每个区域的开始位置和结束位置。
2024-12-22 23:09:01
840
原创 Linux系统中的环境变量 --命令行参数,PATH,通过代码获取环境变量,本地变量
1. 将自己写的二进制程序拷贝到环境变量PATH中存在的目录下,但是不推荐这样,因为PATH环境变量中默认存在的目录都是与系统配置相关的目录,如果将自己的程序拷贝到这些目录中,可能会污染系统指令的环境等。当执行 cd ~ 为什么会直接转到 /home/csq 中,因为在执行这条命令时,把 ~ 替换为环境变量 /HOME 中存储的目录,所以直接就跳转到 /home/csq 中了。SHELL:当前Shell,代表的是使用哪个版本的Shell,它的值通常是/bin/bash这个目录。
2024-12-19 21:58:46
662
原创 Linux系统中进程的概念 -- 冯诺依曼体系结构,操作系统,进程概念,查看进程,进程状态,僵尸进程,孤儿进程,进程优先级,进程切换,进程调度
我们常⻅的计算机,如笔记本。我们不常⻅的计算机,如服务器,目前,我们所认识的计算机都是由一个个的硬件组成,包括如下:包括键盘, ⿏标,扫描仪, 写板,网卡,磁盘(外存)等。含有和等。显⽰器,打印机,磁盘,网卡等。从硬件的角度上来理解,用户1用qq发送一条消息给用户2。本质上就是两台冯诺依曼体系结构的计算机进行数据的交互,具体过程如下:(1)首先用户1和用户2都要启动qq,本质是将qq这个可执行程序加载到内存中。
2024-12-14 12:51:10
1142
原创 C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射关系解除,物理内存也可以释放。⻓期运⾏的程序出现内存泄漏,影响很⼤,如操作系统、后台服务、⻓时间运⾏的客⼾端等等,不断出现内存泄漏会导致可⽤内存不断变少,各种功能响应越来越慢,最终卡死。
2024-11-28 23:43:34
1058
原创 C++中的异常处理
⼀般⼤型项⽬程序才会使⽤异常,下⾯我们模拟设计⼀个服务的⼏个模块每个模块的异常都是Exception的派⽣类,每个模块可以添加⾃⼰的数据最后捕获时,我们捕获基类的引用就可以了。下列程序要完整的运行成功就需要每个模块都调用成功,这里抛出异常的情况使用随机数取模进行模拟。
2024-11-24 11:56:07
1280
原创 Linux环境下的基础开发工具 -- 包管理器,vim,gcc/g++,make/makefile,git,gdb/cgdb
在Linux下安装软件一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序) 放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。软件包和软件包管理器就好比"APP"和"应用商店"这样的关系。yum是Linux下非常常用的一种包管理器。主要应用在Fedora,RedHat,CentOS等发行版上。apt/apt-get主要应用在Ubuntu上。
2024-11-21 23:23:24
1199
原创 C++11语法介绍(2) -- 可变参数模板,default和delete,final和override,lambda表达式,包装器
如果你提供了移动构造或者移动赋值,编译器不会⾃动提供拷⻉构造和拷⻉赋值。
2024-11-15 00:18:08
785
原创 C++11语法介绍(1) -- 列表初始化{},左值和右值,右值引用和移动语义,引用折叠,完美转发
在有些场景下带来的不少便利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。
2024-11-11 18:21:22
1087
原创 C++中unordered_map和unordered_set的介绍以及用哈希表封装实现unordered_map和unordered_set
unordered_set的声明如下,unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key转成整形的仿函数传给第⼆个模板参数。unordered_set底层是⽤哈希桶实现,增删查平均效率是 O(1) ,迭代器遍历不再有序,为了跟set区分,所以取名unordered_set。1.2unordered_set和set的使用差异1.unordered_set和set的第⼀个差异是对key的要求不同,
2024-11-05 20:44:51
1091
原创 C++中封装红黑树模拟实现map和set
2.set实例化rb_tree时第二个模板参数给的是key,map实例化rb_tree时第二个模板参数给的是pair,这样一棵红黑树既可以实现set,也可以实现map。要注意的是对于map和set,find/erase时的函数参数都是Key,所以第⼀个模板参数是传给find/erase等函数做形参的类型的。SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/set_tree.h等几个头文件中。,逻辑正好反过来即可,
2024-10-30 19:13:55
847
原创 Linux权限的概念以及Shell命令的运行原理
上述例子表面csq作为xiaoc.txt该文件的拥有者以及所属组成员,但是该文件的拥有者没有w权限,使用csq用户不能对该文件进行写操作,因为当前csq已经被匹配成该文件的拥有者了,拥有者没有w权限,虽然csq也是该文件所属组的成员,但是身份确认只确认一次,确认为拥有者就不会再确认为所属组成员了。umask的意义:默认权限是OS自主决定的,无法在创建前进行修改 -- umask使新建文件的预设权限可配置,是可以灵活满足需要的一种表现。凡是在umask中出现的权限,就是不希望在预设权限中出现的权限。
2024-10-28 14:10:12
1044
原创 C++中红黑树的实现
/如果为空树,插入的节点作为根//根必须为黑色//找到空位置else//插入节点//插入一个红色的节点else//如果出现连续的红色节点进入下列循环if (parent == grandfather->_left) //如果叔叔节点在右边//变色//继续向上更新else //叔叔不存在或者存在且为黑色if (cur == parent->_left) //插入到p的左边。
2024-10-26 15:20:45
1385
原创 初识C语言以及C语言常见概念
在VS上写代码,我们是需要创建项⽬的,直接新建项⽬就可以了。在项⽬中就可以添加源⽂件和头⽂件。C语⾔把 .c 为后缀的⽂件称为源⽂件,把 .h 为后缀的⽂件称为头⽂件。C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。1.关键字都有特殊的意义。2.程序员自己在创建标识符的时候不能和关键字重复。3.关键字也是不能自己创建的。
2024-10-26 02:21:02
1176
原创 Linux基本命令
常用选项:-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖15. cat命令语法:cat [选项] [文件]功能: 查看目标文件的内容,适合看短文件。常见选项:-b 对非空输出行编号-n 对输出的所有行编号-s 不输出多行空行。
2024-10-25 18:57:22
1021
原创 C++AVL树的介绍和实现
AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。
2024-10-13 15:03:12
877
原创 C++中map和set的使用
class set;T就是set底层关键字(数据)的类型。set默认要求T⽀持⼩于⽐较。set底层是⽤红⿊树实现,增删查效率是,迭代器遍历是⾛的搜索树的中序,所以是有序的。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,
2024-10-12 13:24:00
958
原创 C++模拟实现二叉搜索树
二叉搜索树又称二叉排序树,(1)若它的左子树不为空,则。(2)若它的右子树不为空,则。(3)它的。(4)二叉搜索树,具体看使用场景定义。如下图,左边是不支持插入相等的值,右边支持插入相等的值。
2024-10-08 15:28:01
1236
原创 C++多态、虚函数以及抽象类
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数(虚函数),产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-10-05 13:29:37
1444
原创 C++模板进阶
一个程序(项目)又若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译。3.2模板的分离编译// a.h// a.cppint main()Add(1, 2);return 0;c/c++程序要运行,一般要经历以下步骤:预处理 -> 编译 -> 汇编 -> 链接。编译是对程序按照语言特性进行词法,语法,语义分析,错误检查无误后生成汇编代码,注意头文件不参与编译,编译器对工程中的多个源文件是分离开单独编译的。
2024-10-03 21:13:03
978
原创 C++仿函数的介绍以及priority_queue的介绍和模拟实现
仿函数的本质是一个类模板,只是这个类重载了operator(),所以当使用一个它的对象时看起来像使用和函数一样,所以被称为仿函数。int b = 10;return 0;自定义类型需要使用仿函数进行比较时,需要在自定义类型里面提供<和>等比较运算符的重载。
2024-10-02 16:54:15
1529
原创 C++中stack和queue的模拟实现
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另一个接口。如上图,需要将两个插口的插头转换为插座能使用的三个插口的插头,就需要一个适配器进行转换,适配器也可以叫做转换器。1.2STL标准库中stack和queue的底层结构虽然stack和queue中也可以存放元素,但是STL中并没有将其划分在容器的行列,而是将其称为容器适配器,
2024-10-02 15:30:52
1049
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人