- 博客(54)
- 收藏
- 关注
原创 【Linux】select、poll和epoll详解
正如上文介绍 select 函数相关宏所介绍的,select 函数调用前后可能会修改 readfds、writefds 和 exceptfds 这三个集合中的内容,所以如果读者想下次调用 select 函数时复用这些 fd_set 变量,记得在下次调用前使用 FD_ZERO 将 fd_set 清零,然后再调用 FD_SET 将需要检测事件的 fd 重新添加到 fd_set。在 Linux 平台上,select 函数的实现是利用 poll 函数的,有兴趣的读者可以查找一下相关的资料来阅读一下。
2025-08-06 11:45:39
1041
原创 【Linux】C++网络编程总结
不管多么复杂的服务器或客户端程序,其网络通信的基本原理一定如下所述:中查看。对于上面的图,我们可能会疑惑,为什么client中调用close(),会和server的recv()函数有关呢?这个问题这几道recv()函数的返回值意义,我们后面再来解答这个问题。
2025-08-06 10:34:23
501
原创 【Python3】Python进阶1
print(f"耗时:{self.end - self.start:.2f}秒")函数代码块以def关键词开头,后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函数内容以冒号 : 起始,并且缩进。return [表达式]结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
2025-06-20 10:53:58
704
原创 【Linux】DBUS基础
D-Bus是一种高级的进程间通信机制,它由freedesktop.org项目提供,使用GPL许可证发行。D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。D-Bus的主要概率为总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。目前,D-Bus已被大多数Linux发行版所采用,开发者可使用D-Bus实现各种复杂的进程间通信任务。
2025-06-19 13:45:23
884
原创 【Python3】Python3基础
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。
2025-06-16 17:02:09
758
原创 【C++】C++17之std::optional
可以说,C++由两部分组成:语言本身和标准库。第一部分,即语言本身,侧重于富有表现力的代码和严谨的语法。第二部分则为你提供工具、实用程序和算法。例如,在C++11中,引入的lambda表达式简化了短函数对象的编写。C++14允许函数返回类型进行‘auto’类型推导,这也缩短了代码长度并简化了模板代码。C++17作为C++标准的一次重大更新,带来了许多令人惊叹的语言特性,总体上使该语言更加清晰、简洁。例如,借助,你可以减少对enable_if和标签分派技术的依赖。
2025-06-13 16:35:20
826
原创 设计模式(二)
适配器模式主要原理: 在于实现客户接口时,关联上已存在的功能接口。一种使用过多继承方式,一种通过类之间依赖的方式,都能实现。为统一多个功能相同的类接口时,类适配器模式是更适合的。比较典型的例子如,MySql和SQLServer等多种类型数据库的访问接口的统一。C++编程不要轻易使用多继承!另外,文中也有说过。在软件开发初,无第三方需求接口的情况下,不要考虑此模式的使用。往往适配器模式的使用,会让代码看起来像一个补丁,修修补补。「适配器模式」看起来与「外观模式」相似,都是与外部对接。
2025-06-13 16:19:41
609
原创 AVLTree
二叉平衡树 BST树+节点平衡操作(节点平衡 任意节点左右字输的高度不超过1)2.右孩子的右子树太高了。1.左孩子的左子树太高了。3.左孩子的右子树太高了。4.右孩子的左孩子太高了。左-右旋转 左平衡操作。右-左旋转 右平衡操作。
2025-03-24 23:30:14
176
1
原创 C++题目
野指针就是没有被初始化的指针,悬空指针就是最初指向的内存已经被释放的一种指针。产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。(1)初始化置NULL(2)申请内存后判空(3)指针释放后置NULL(4)使用智能指针c++类内可以定义引用成员变量,但要遵循以下三个规则:不能用默认构造函数初始化,必须提供构造函数来初始化引用成员变量。否则会造成引用未初始化错误。构造函数的形参也必须是引用类型。
2025-03-24 23:27:50
787
1
原创 【MySQL】基础
指从多张表中查询信息。笛卡尔积:笛卡尔积是指在数学中,两个集合A和集合B的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句时,MySQL会立即隐式的提交事务。
2025-03-19 01:15:37
1062
原创 【算法】BST的非递归插入,删除,查询
对于二叉树上的每一个节点,如果满足左孩子的值 < 父节点的值 < 右孩子的值,把满足上面性质的二叉树就称作BST树,Binary Search/Sort Tree。3.删除的节点有两个孩子,找待删除节点的前驱节点(或者后继节点),用前驱或者后继节点的值把待删除节点的值覆盖掉,然后直接删除前驱或者后继节点就可以了。BST如果不为空,从根节点开始比较,找到合适的位置,生成新的节点,并把节点的地址写入父节点相应的地址域当中。的有序性,它具有快速的查找、插入和删除操作的特点,因此被广泛应用于数据结构和算法中。
2025-03-10 19:49:20
544
原创 muduo网络库2
Muduo网络库:底层实质上为Linux的epoll + pthread线程池,且依赖boost库。muduo的网络设计核心为一个线程一个事件循环,有一个main Reactor负载accept连接,然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor),该连接的所用操作都在那个sub Reactor所处的线程中完成。多个连接可能被分派到多个线程中,以充分利用CPU,Reactor poll的大小是固定的,根据CPU的数目确定。
2025-02-25 21:26:02
1235
原创 muduo网络库1
select实现多路复用的方式是,将已经连接的socket都放到一个文件描述符集合中,然后调用select函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此socket标记为可读或可写,接着再把整个文件描述符集合拷贝回用户态,然后用户态还需要再通过遍历的方法找到可读或可写的socket,然后对其处理。因此,基于select模型的服务器程序,要达到100万级别的并发访问,是一个很难完成的任务。
2025-02-25 21:10:50
786
原创 Golang初识
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的C语言。所以Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语言”,当然从各种角度看,Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想。
2025-01-22 23:09:09
899
原创 【HTTP】HTTP协议
超文本传输协议,是一个简单的请求,响应协议,它通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,请求和响应消息的头以ASCII形式给出,而消息内容则具有一个类似MMF的格式,HTTP是万维网的数据通信的基础。
2024-12-02 12:27:12
927
原创 【Linux】select,poll和epoll
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符fd,一旦某个描述符就绪(一般是读就绪或者写就绪),系统会通知有I/O事件发生了(不能定位是哪一个)。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 select、poll和epoll这三个函数是Linux系统中I/
2024-11-27 19:58:11
933
原创 【Linux】网络通信
TCP协议是一个安全的、面向连接的、流式传输协议,所谓的面向连接就是三次握手,对于程序猿来说只需要在客户端调用connect()函数,三次握手就自动进行了。先通过下图看一下TCP协议的格式,然后再介绍三次握手的具体流程。
2024-11-26 20:45:09
1421
1
原创 【Linux】Ubuntu中muduo库的编译环境安装
muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码,TcpServer源码,还有很多muduo库应用的示例代码等,学习一下作者优秀的C++多线程网络编程设计思想。【注意】:如果Linux系统没有安装g++编译器,需要先安装g++,建议g++4.6版本以上,能比较好的支持C++新标准,可以通过命令 g++ --version 查看g++版本号。这就是muduo库的头文件和库文件了。
2024-11-13 17:00:29
1653
2
原创 【Linux】网络编程3
该数组里列出这个进程打开的所有文件的文件描述符。数组的下标是文件描述符,是一个整数,而数组的内容是一个指针,指向内核中所有打开的文件的列表,也就是说内核可以通过文件描述符找到对应打开的文件。然后每个文件都有一个inode,Socket 文件的 inode指向了内核中的Socket 结构,在这个结构体里有两个队列,分别是发送队列和接收队列,这个两个队列里面保存的是一个个struct sk_buff,用链表的组织形式串起来。在TCP通信的过程,服务器端会产生两类不同的文件描述符,一个是监听的文件描述符;
2024-11-12 23:07:13
788
原创 【Linux】网络编程2
TCP是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。安全:tcp通信过程中,会对发送的每一数据包都会进行校验, 如果发现数据丢失, 会自动重传流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致。
2024-11-11 19:49:42
1142
原创 【Linux】网络编程1
局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。IP(Internet Protocol):本质是一个整形数,用于表示计算机在网络中的地址。IP协议版本有两个:IPv4和IPv6。使用一个32位的整形数描述一个IP地址,4个字节,int型也可以使用一个点分十进制字符串描述这个IP地址: 192.168.247.135。
2024-11-10 16:09:35
884
原创 【设计模式】观察者模式
观察者模式也叫做观察者-监听者模式(发布-订阅模式):主要关注的是对象之间的通信,关注的是对象的一对多的关系,也就是多个对象都依赖一个对象,当该对象的状态发生改变时,其他对象都能接收到相应的通知。例子:基于同一组数据,生成了很多不同的界面来显示,有曲线图显示方式,有圆饼图显示方式,有柱状图显示方式等等…,当底层数据发生改变时,所有基于同一组数据的图像显示都需要修改图像,那么此时有两种实现方式:1 .所有图形界面模块都去观察底层数据是否做了改变,如果变化,那么读取数据,修改图像显示。
2024-11-09 14:31:37
1011
原创 【设计模式】单例设计模式
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。
2024-11-09 13:38:52
1631
原创 【C++11】智能指针
学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压力,当然智能指针无法替代裸指针的全部功能。那么,我们在使用裸指针的时候会遇到哪些问题呢??
2024-11-07 13:31:28
1026
原创 【STL】STL之容器适配器
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)。容器适配器分为stack(栈),queue(队列)和priority_queue(优先级队列)
2024-11-05 20:13:43
1029
原创 【C++】C++四种类型转换方式
C++语言级别提供了四种类型转换方式。C风格的转换格式很简单,但是有不少缺点的:1.隐式类型转化有些情况下可能会出问题:比如数据精度丢失2.显式类型转换将所有情况混合在一起,代码不够清晰因此C++提出了自己的类型转化风格,注意。
2024-11-05 13:04:51
358
原创 【C++】Any类的介绍和构建
在java或c#中,Object类型对象可以指向任意类型的变量,因为所有的类默认都从Object类继承。但是在c++中,没有类似Object类这样的类型,而很多时候,为了设计出通用的程序,往往需要类似于Object类型作为参数或者返回值。这种类型十分好用,所以在C++17钟就引入了Any类(上帝类),类似与Java中的Object类,是所有类类型的基类,也就是父类。我们很容易想到使用template模板。
2024-10-28 21:57:26
954
原创 【Linux】Linux之多线程1
在一个程序里的一个执行路线叫做线程(thread),更准确的定义是:线程是一个进程内部的控制序列。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2024-10-24 22:26:29
847
原创 【Linux】Linux之基础IO
pathname:要打开或创建的目标文件;flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行"或“运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写返回值:成功:新打开的文件描述符失败:-1open。
2024-10-17 19:51:14
1006
原创 【Linux】Linux进程控制
在之前我们认识了fork()函数,fork函数从一个已存在进程中创建了一个新进程,新进程为子进程,而原进程为父进程。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表中fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序。注意到进程17944没有打印出以前的pid,为什么呢??
2024-10-17 15:11:53
808
原创 【STL】STL之vector
1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2024-10-15 21:35:52
778
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人