- 博客(65)
- 收藏
- 关注
原创 Linux网络编程—应用层协议HTTP
HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。HTTP Session是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于HTTP协议是无状态的(每个请求都是独立的),因此服务器需要通过Session来记住用户的信息。
2025-11-27 12:00:49
793
原创 Linux网络编程—应用层自定义协议与序列化
toStyledString、StreamWriter 和 FastWriter 提供了不同的序列化选项,你可以根据具体需求选择使用。Json::Reader 和 parseFromStream 函数是Jsoncpp中主要的反序列化工具,它们提供了强大的错误处理机制。在进行序列化和反序列化时,请确保处理所有可能的错误情况,并验证输入和输出的有效性。
2025-11-18 22:15:32
1068
原创 Linux网络编程—网络基础概念
TCP/IP协议的本质是一种解决方案TCP/IP协议能分层,前提是因为问题们本身能分层截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。OS源代码一般都是用C/C++语言写的。下面,仔细看看下面的图问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?回答:答案是肯定的!因为双方都有同样的结构体类型struct protocol。
2025-11-10 20:25:37
701
原创 Linux系统编程—线程同步与互斥
某些类,只应该具有一个对象(实例),就称之为单例。例如一个男人只能有一个媳妇。在很多服务器开发场景中,经常需要让服务器加载很多的数据 (上百G) 到内存中。此时往往要用一个单例的类来管理这些数据。自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。但是不合理的使用,可能会造成CPU的浪费。
2025-10-29 11:37:41
1084
原创 Linux系统编程—线程概念与控制
LWP是轻量级进程,在Linux下进程是资源分配的基本单位,线程是cpu调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化线程互斥指的是在多个线程间对临界资源进行争抢访问时有可能会造成数据二义,因此通过保证同一时间只有一个线程能够访问临界资源的方式实现线程对临界资源的访问安全性。
2025-10-27 23:40:46
713
原创 Linux系统编程—Linux进程信号
上面所说的所有信号产生,最终都要有OS来执行,为什么?OS是进程的管理者信号的处理是否是立即处理的?在合适的时候信号如果不是被立即处理,那么信号是否需要暂时被进程记录下来?记录在哪里最合适呢?一个进程在没有收到信号的时候,能否知道,自己应该对合法信号作何处理呢?如何理解OS向进程发送信号?能否描述一下完整的发送处理过程?
2025-10-12 16:07:07
664
原创 Linux系统编程—进程间通信
一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出。当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果所有管道写端对应的文件描述符被关闭,则read返回0。管道是有固定大小的,多少?
2025-10-02 10:46:38
916
原创 Linux系统编程—库制作与原理
库是写好的现有的、成熟的、可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
2025-09-22 09:40:15
677
原创 Linux系统编程—基础IO
pathname:要打开或创建的目标文件flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY:只读打开O_WRONLY:只写打开O_RDWR:读,写打开上面三个常量,必须指定一个且只能指定一个O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND:追加写返回值:成功:新打开的文件描述符失败: - 1mode_t理解:直接 man 手册,比什么都清楚。
2025-09-11 22:20:55
733
原创 Linux系统编程—进程控制
在继续学习新知识前,我们来思考函数和进程之间的相似性exec/exit就像call/return一个C程序有很多函数组成。一个函数可以调用另外一个函数,同时传递给它一些参数。被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信。这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图一个C程序可以fork/exec另一个程序,并传给它一些参数。
2025-09-06 21:30:25
1058
原创 Linux系统编程—进程概念
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
2025-08-29 21:40:52
675
原创 Linux系统编程—Linux基础指令
本⻔课程学习Linux系统编程,你可能要问Linux从哪⾥来?它是怎么发展的?在这⾥简要介绍Linux的发展史。要说Linux,还得从UNIX说起。
2025-08-15 21:40:12
656
原创 C++进阶—STL之空间配置器
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。
2025-08-11 09:41:45
646
原创 C++进阶—C++的IO流
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?使用itoa()函数使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。return 0;在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。
2025-08-06 19:15:08
638
原创 C++进阶—特殊类设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
2025-08-05 15:05:54
544
原创 C++进阶—智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。2.2 内存泄漏分类堆内存泄漏(Heap leak)
2025-08-02 10:52:06
817
原创 C++进阶—异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了public:protected://错误描述int _id;//错误编号public:return str;return str;
2025-07-31 14:47:12
665
原创 C++进阶—哈希
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log₂N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。
2025-07-23 22:38:58
822
原创 C++进阶—map和set
set文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。
2025-07-17 23:42:21
644
原创 C++进阶—二叉树进阶
问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。b、最多查找高度次,走到到空,还没找到,这个值不存在。b. 树不空,按二叉搜索树性质查找插入位置,插入新节点。
2025-07-08 15:25:25
788
原创 C++进阶—多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写2.2虚函数虚函数:即被virtual修饰的类成员函数称为虚函数。public:virtual void BuyTicket() { cout << "Person买票-全价" << endl;
2025-06-20 15:32:38
635
原创 C++进阶—C++中的继承
1.2.1定义格式下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化类成员/继承方式public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员。
2025-06-13 10:20:39
1242
原创 C++初阶—模版进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2025-03-20 16:21:57
995
原创 C++初阶—stack和queue类
queue的文档介绍翻译:1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。
2025-03-12 15:30:05
958
原创 C++初阶—list类
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2025-02-27 14:56:24
1248
原创 C++初阶—vector类
(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造。
2025-02-14 10:16:36
1068
原创 C++初阶—string类
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
2025-01-27 15:47:17
858
原创 C++初阶—C&C++内存管理
/malloc没有办法很好支持动态申请的自定义对象初始化//构造函数是实例化对象的时候自动调用,现阶段无法显示调用//new主要针对自定义类型设计//对于自定义类型,开空间+调用构造函数初始化//支持传参//对于自定义类型,调用析构函数+释放空间delete p2;delete p3;//多个对象//new多个对象并初始化//1.有名对象A aa1(1);
2025-01-10 15:22:18
1161
原创 C++初阶—类与对象(中篇)
public://// 如果用户显式定义了构造函数,编译器将不再生成//{//}private:int _year;int _month;int _day;// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数// 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成// 放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用Date d1;return 0;//示例1。
2024-12-07 09:14:33
879
原创 C++初阶—类与对象(上篇)
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。2.类声明放在.h文件中,成员函数定义放在.cpp文件中。成员函数名前需要加类名一般情况下,更期望采用第二种方式。注意:后续为了方便演示使用方式一定义类,在工作中尽量使用第二种。// 下面的函数,形参和成员变量同名,很难区分public:// 这里的year到底是成员变量,还是函数形参?// 所以一般都建议这样public:private:int _year;
2024-11-28 15:19:43
878
原创 C++初阶—C++入门
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。int a = 0;auto b = a;//auto根据右边的值自动推导左边的类型//c是int*//d是a的引用//普通场景没有什么价值//类型很长,就有价值,简化代码//上方代码简化后//查看类型【注意】
2024-11-26 14:21:02
774
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1