- 博客(67)
- 收藏
- 关注
原创 Linux --TCP协议实现简单的网络通信(中英翻译)
本文介绍了TCP协议及基于TCP协议的服务端与客户端实现方案。服务端采用线程池处理并发请求,实现英文字典翻译功能;客户端具备断线重连机制。重点内容包括:1) TCP服务端搭建流程(套接字创建、绑定、监听);2)自定义线程池设计,实现任务队列管理;3)守护进程实现服务后台运行;4)客户端包含自动重连功能;5)字典翻译服务模块实现。系统设计强调可靠性、并发处理能力和断线恢复能力,通过Makefile编译后即可实现7x24小时持续服务。
2025-06-02 23:24:27
692
原创 Linux --UDP套接字实现简单的网络聊天室
本文介绍了基于UDP协议的客户端-服务器通信系统的实现。服务器端通过创建套接字、绑定端口、接收消息并广播给所有在线用户;客户端创建套接字后,使用两个线程分别处理消息发送和接收。系统支持用户登录检测和消息转发功能,并通过本地和跨平台测试验证了功能。文中提供了完整的C++实现代码,包括服务器端(UdpServer类)、客户端(ThreadData结构)以及Makefile编译文件。该系统实现了基本的UDP网络通信功能,可作为即时通讯应用的底层框架。
2025-05-31 01:32:25
578
原创 LINUX 线程(下)
本文介绍了两种生产者-消费者模型的实现方法。首先分析了生产者-消费者模型的基本概念,包括三种关系(生产者间互斥、生产消费者间互斥与同步、消费者间互斥)、两种角色和共享内存这一交易场所。然后详细讲解了基于阻塞队列的实现方式,通过互斥锁和条件变量确保线程安全,并给出了完整的C++代码实现。接着介绍了基于环形队列的优化方案,利用信号量管理资源数量,实现了更高效的数据存取。两种方法都通过实际代码演示了生产者线程生成计算任务、消费者线程处理任务的完整流程。文章最后提供了对应的Makefile编译指令和运行结果说明,为
2025-05-27 13:21:21
345
原创 Linux 线程(中)
本文主要探讨了线程的局部存储、多线程并发访问共享资源带来的问题及其解决方法。首先,通过代码示例展示了线程具有独立的栈空间,而全局变量在未使用__thread修饰时是共享的,使用后则每个线程独有一份。接着,文章指出了多线程并发访问共享资源可能导致的数据不一致问题,并介绍了通过互斥锁来解决这一问题的方法,包括锁的初始化、销毁、上锁和释放锁的接口及其使用。此外,文章还讨论了互斥与同步的概念,以及如何通过条件变量来实现线程的同步,避免线程饥饿问题。最后,文章简要介绍了锁的原理、死锁的概念及其四个必要条件,并提出了解
2025-05-22 11:17:42
1171
原创 Linux 线程(上)
本文深入探讨了Linux系统下的线程概念及其管理机制。首先,文章通过图解方式重新解释了进程和线程的关系,指出进程是系统资源分配的基本单位,而线程是CPU调度的基本单位。接着,文章介绍了pthread库的使用,包括如何创建、等待和批量创建线程,并详细解释了pthread_t tid、LWP和PID之间的关系。此外,文章还讨论了线程的分离、退出和取消等控制操作,以及线程的特点和优势。最后,文章总结了线程在系统调度、资源占用和通信速度等方面的特性,强调了多线程编程的高效性和适用场景。通过本文,读者可以更全面地理解
2025-05-18 20:51:32
878
原创 Linux 信号终篇(总结)
本文详细介绍了Linux系统中信号从产生到处理的全过程。首先,信号可以通过键盘组合键、Linux命令、系统调用、异常和软件条件等五种方式产生。其次,信号的保存通过三张表实现:block表记录信号是否被屏蔽,pending表记录信号是否已产生但未处理,handler表保存信号处理方法。接着,信号捕捉通过signal和sigaction接口实现,并讨论了可重入函数和volatile关键字的作用。最后,介绍了基于信号方式的进程等待,包括子进程退出时发送信号给父进程,以及通过循环非阻塞轮询或忽略信号自动回收子进程。
2025-05-10 21:55:08
1025
原创 Linux 信号(下篇)
①核心转储功能,用来当进程出错的时候把运行时的出错信息保存在程序当前目录下,文件名为core.pid;②当以后调试的时候直接打开core文件就可以快速定位到出错的那一行代码;③为什么服务器要把core dump功能关掉?因为:如果不关掉,一旦进程出现异常终止后就会在进程的当前目录下创建core文件并保存其运行时的信息;不要忘记了当程序异常的时候OS并没有直接把它杀死掉,而是让用户自己决定,如果用户没有让进程结束,cpu会一直调度这个进程并一直出异常并一直创建core文件在其当前目录下!
2025-05-07 22:24:42
895
原创 Linux 信号
在linux中,一次登陆,一个终端一般会配上一个bash,每一个登陆只允许一个进程是前台进程,可以运行多个进程是后台进程,谁是前台谁是后台取决于谁来获取键盘输入,能获取的就是前台进程;//1. 这个接口的作用是获取信号,并且修改信号的处理方式//2. sighandler_t 这是一个函数指针类型,函数的返回值为void,函数参数类型为int//3. sigbum为接收到的信号数字,handeler : 你需要传入一个已经定义好的方法①:只要设置一次,往后都有效;
2025-05-02 22:31:10
693
原创 Linux -- SysremV 共享内存通信
①:第一步进程A向物理内存中申请创建一块资源空间;②:第二步申请成功后把这块内存对应的虚拟地址挂载到进程A的地址空间中;③:第三步进程B向物理内存中获取进程A已创建好的资源,④:进程B获取成功后,把对应的虚拟地址挂载到进程B的地址空间中;⑤以上步骤实现完就已经建立了⑥:通信结束后进程A取消对这块共享内存的关联,进程B也取消对这块共享内存的关联;⑦:最后一步:谁把这块共享内存创建出来的谁就来释放,这里明显是进程A来创建的所以只需要进程A来释放,进程B啥事也不用做;
2025-04-30 15:21:40
1081
原创 Linux 命名管道+日志
例如:当程序运行发生错误时,这是一个Error消息,把错误信息的等级、发生时间、错误内容、错误码按照自己的需求打印出来(可以打印到屏幕或者某个文件,也可以根据日志等级把信息分类打印到不同的文件);进程A、B之间实现了通信,当写端关闭后B读到文件末尾返回值0退出循环;可以看到三条日志消息都分类打印到不同的文件中!运行B:(B在等待键盘输入,且A打印了一句):比较严重需要立即处理;运行A:(A进程在等待读)
2025-04-29 17:09:27
393
原创 Linux -- 利用管道实现一个简单的进程池
我们可以一次性创建一批子进程,然后父进程为每一个子进程之间建立一个管道通信,之后父进程就可以通过向创建好的管道里写入任务码,子进程通过向管道里读取任务码执行对应的任务!图解:此时我们就一次性创建了一批进程,当需要执行任务的时候直接让某个进程去执行,不需要每次使用的时候再去创建!此时父进程相当于master(主导读写操作),进程1、2、3、4、5为salver(只)!父进程通过对所有管道的管理实现对所有子进程的管理!
2025-04-26 12:27:53
437
原创 Linux 管道理解
①具有血缘关系的进程;②父子进程会协同,同步与互斥,---保护管道文件的数据安全;③管道只能单向通信;④管道是面向字节流的;⑤管道是基于文件的,而文件的生命周期是随进程的;
2025-04-23 23:38:44
1105
2
原创 Linux 动、静态库的实现
当我们写了一段代码实现了一个方法,如果我们不想把方法的实现过程暴露给别人看,可以把代码打包成一个库,其中形成后缀为.a的是静态库,后缀为.so的为动态库;当别人想使用你的方法时,把打包好的库跟头文件一起扔给他就行。
2025-04-20 22:52:19
1468
原创 C++ STL 关联式容器之二 map
Hello!!大家早上中午晚上好!!上一篇写到set的实现底层是对红黑树的套用,今天我们也来实现一下map吧!!
2025-04-16 13:05:03
268
原创 C++ STL-- 关联式容器之一 -- set
AVL树是一个平衡二叉搜索树,当向二叉搜索树中插入新节点后,如果能保证每个节点的左右子树高度之差的绝对值不超过1(需要对树中的节点进行调整),即可降低树的高度,从而减少平均搜索的长度;②为什么要用AVL树:因为二叉搜索树虽然可以降低查找效率,但如果数据有序或接近有序的时候将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下:例如:当数据是 1 2 3 4 5 6 ....13 14 时:二叉搜索树是这个样子:这样的搜索树高度很高,搜索次数会增加,效率大大下降!③怎么使用?怎么实现AVL树。
2025-04-13 11:34:25
554
原创 C++ STL简单的几个容器
Hello!!大家早上中午晚上好!!本文将介绍几个使用了适配器的容器的使用方法和模拟实现,例如:stack、queue、priority_queue!!
2025-04-02 23:33:09
469
原创 C++ List的模拟实现
/节点的定义(定义成模版可以接受各种类型)T _data;public:void emptyinit()//对空链表的初始化_size = 0;while (it!++_size;delete cur;--_size;
2025-03-30 17:42:55
416
原创 C++ Vector的模拟实现
需要注意迭代器失效的问题,当扩容的时候,资源已经转移到另一块空间pos指向的位置也要跟着改变;!!!咱下期见!!!
2025-03-24 13:08:34
442
原创 C++ STL序列式容器之二 - - Vector
vector是可以改变大小的数组;明确数组:同一类型的元素的集合;明确可改变大小:当你存储数据时,会根据你存储的内容改变数组大小,也就是会自动扩容;总结:vector是会自动扩容的同一类型的元素的集合!
2025-03-22 16:23:19
926
原创 C++ STL序列式容器之一 string
普通对象可对最后一个字符进行访问和修改操作;对const对象只能访问;int main()//报错return 0;跟back的操作类似;int main()//普通对象return 0;int main()//const对象//报错return 0;
2025-03-19 17:36:28
776
原创 C++ 类型转换
注意 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是 否还有其他不同的方法达到同一目的,如果R非强制类型转换不可,则应限制强制转换值的作用 域,以减少发生错误的机会。强烈建议:避免使用强制类型转换!三、RTTI(了解)3.1、
2025-03-18 17:25:41
906
原创 C++11 lambda表达式、包装器、Bind绑定
捕捉列表](参数列表)->返回值{函数体};捕捉列表:捕捉上下文的变量供lambda函数使用可省略;参数列表:与普通函数的参数列表一样,如果没有可省略;->:可省略;返回值:如果为空或已确定返回类型,可省略;函数体:如果没有要写的也可省略;最简洁的lambda表达式: []{};包装器是函数适配器,用来包装可调用对象,包装器实质是一个模版:包装器的头文件: <functional>其中Ret是返回类型,Args...是可变参数;
2025-03-17 22:25:06
456
原创 C++11 emplace_back和push_back区别
Hello!!大家早上中午晚上好!!今天我们来看看emplace_back到底是什么?
2025-03-16 17:40:43
601
原创 C++11 右值引用和移动语义(2)
1、万能引用只存在模版,当在模版里设置参数为&&时代表的不是右值引用,而是既可以接收左值也可以接受右值:(如果传进来是右值它就是右值引用,如果传进来是左值它就会发生引用折叠变成左值引用);2、万能引用+引用折叠=完美转发的产生!!这些条件缺一不可!3、完美转发的作用是让参数保持它传入进来前的属性!!
2025-03-15 01:58:14
913
原创 C++11 右值引用和移动语义
可以取地址的值,赋值符号左边的值;return 0;不可以取地址的值,赋值符号右边的值;//报错return 0;左值引用就是给在左值取别名;int& b = a;return 0;a是左值,b给a区别名,b是a的左值引用;右值引用就是给右值取别名;(语法:&& )int main()int a = 10;return 0;
2025-03-14 01:03:03
675
原创 C++ 多态★★★★★★★
简单的来说,多态就是多种形态,不同的对象去完成某个行为会产生不同的状态;//一个简单的虚函数class Apublic:Fun1()就是一个虚函数,条件:被virtual修饰+必须在类内!重写也叫覆盖,重写必须是虚函数,只有虚函数才能被重写!虚函数的重写(覆盖):在子类中定义了一个跟基类完全一样的虚函数(即:函数名、参数列表、返回类型完全相同)public:virtual void Fun1()//三同:函数名、返回类型、参数列表此时我们称子类的Fun1()重写父类的Fun1();
2025-03-10 18:04:16
995
原创 C++ 继承(2)
回观整个问题产生及解决过程:继承衍生出多继承 -> 多继承衍生出菱形继承 -> 菱形继承衍生出数据冗余以及二义性的问题 -> 解决办法虚拟继承 -> 虚拟继承实现原理 -> 利用虚基表指针 -> 虚基表存放偏移量 -> 通过指针访问解决问题!!因此解决菱形继承问题是非常复杂的过程,在我们以后的程序设计尽量避免设计成菱形继承!!!组合就是在类里面直接使用定义好的类,不需要继承!
2025-03-09 14:28:17
512
原创 C++ 继承★★★★★
class Person //基类public:char _name[10]="张三";//姓名//电话protected:char _sex[5] = "男";//性别private:char _adress[10]="中国";//地址class Student:public Person //公有继承Person的派生类 Studentpublic://学号char _major[10]="数学";//专业int main()Student s1;
2025-03-08 17:17:07
649
原创 C++ 模版★★★
模版是泛型编程的基础 -> 什么是泛型编程?-> 代码复用的一种手段 -> 什么手段?-> 编写与类型无关的通用代码,所以模版就是一段与类型无关的通用代码!函数模版代表了一个函数家族,该函数模版与类型无关,使用时被参数化,根据实参类型生成特定类型的函数;class 类模版名//类成员template <class T>//template(关键字) + <class/typename T(T是根据传入的类型实例化出对应的类型)>class Apublic:A(T a,T b)_a = a;
2025-03-07 15:12:17
513
原创 C/C++ 内存管理(2)
delete p2;return 0;运行:对于申请单个空间,new自定义类型会在new的时候调用构造函数创建对象,在delete的时候调用析构函数清理对象资源;malloc和free跟申请释放内置类型没区别;delete[]p2;return 0;
2025-03-06 15:35:54
1129
原创 C++ 类和对象(下)
以冒号开始,逗号分隔成员列表,成员变量后面紧跟括号,括号里放的是初始值或表达式例:一个简单的初始化列表//初始化列表class Apublic:private :int _a;int _b;友元突破了类的封装特性,使其使用起来更方便,但同时增加程序的耦合度,破坏封装,因此友元不宜多用!!
2025-03-04 16:19:53
952
原创 C++ 类和对象(中)
/空类什么都没有吗?class A{};当我们没有显式定义的时候,类里面包含了六个默认成员函数,其中我们需要重点掌握前4个构造函数是特殊的成员函数,是用来初始化对象的①构造函数函数名与类名相同;②构造函数没有返回值;③对象实例化的时候自动调用;④构造函数可以重载class Apublic:A(int a,int b)//显式定义的构造函数,对对象的成员变量初始化工作_a = a;_b = b;int _b;int main()
2025-03-03 16:19:37
909
原创 C++ 类和对象(上)
类定义关键字class类名+{//括号体类定义成员变量或成员函数}+;分号必须要写上//类的定义//成员变量或成员函数其中{}里的内容是称为类体,类体内定义的变量称为成员变量或类的属性,类体内定义的函数称为成员函数或类的方法;①声明和定义全部放在类体内//.h文件public:private:int _id;//学号//姓名//班级②声明和定义分离//在.h文件声明public:private:int _id;//学号//姓名//班级//在.cpp文件定义。
2025-03-02 15:30:14
611
原创 C++入门基础之引用(复习)
Hello!!大家早上中午晚上好,今天我们来复习C++入门基础篇之引用!!!例:2、引用必须初始化!不初始化会报错;例:运行:可以这么理解,pa就是a,pa只能是a,a改变影响pa,pa改变影响a;编译报错:对于const 常变量必须要用const 引用不然编译会报错因为这里涉及的是权限的放大,权限可以缩小但不能放大例:这里从int到const int是权限的缩小,所以没问题;例:对于以上情况如果用test1传值传参每次调用test1都会生成一份a的临时拷贝,调用10
2025-03-01 00:28:47
245
原创 C++入门基础(复习)
前提条件:在同一作用域下函数名相同!满足以下其中一个条件就构成函数重载:①函数名相同,参数个数不同;②函数名相同,参数类型不同;③函数名相同,参数个数相同参数类型顺序不同;跟返回值无关1.2 示例//参数个数不同void fun()int main()fun();fun(1);return 0;运行:int main()fun(1);fun(1.4);return 0;运行:int main()fun(1,1.4);fun(1.4,1);
2025-02-28 01:16:56
796
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人