自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 TCP:协议、序列化与反序列化、JSON 数据和jsoncpp

概念:在Linux 网络的语境下,协议指的是一套标准化的规则和约定,它规定了网络中不同的计算机、设备或程序之间如何进行可靠、高效的数据通信。简单来说,协议就是设备之间通信的“共同语言”和“行为准则”。没有协议,网络设备就像说着不同语言、没有交通规则的人在街上乱走,无法有效沟通。其实,协议就是双方约定好的结构化的数据。

2025-12-28 20:32:59 549

原创 进程间关系与守护进程

之前我们提到了进程的概念, 其实每一个进程除了有一个进程ID(PID)之外还属于一个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。每一个进程组也有一个唯一的进程组ID(PGID), 并且这个PGID 类似于进程ID, 同样是一个正整数, 可以存放在pid_t 数据类型中。进程组用于组织相关进程并进行统一管理进程组(Process Group)要点一组相关进程的集合每个进程都属于一个进程组进程组ID(PGID)等于组长的PID主要目的是为了作业控制#结果如下。

2025-12-28 20:29:32 571

原创 recv和send(及与read、write的区别)

recv() 是 Linux 网络编程中用于从套接字接收数据的核心函数参数说明参数说明套接字描述符(socket descriptor)接收数据的缓冲区地址缓冲区最大长度接收标志,控制接收行为常用 Flags当 recv() 函数的 flags 参数为0时,表示使用默认的接收行为。这是最常用、最简单的调用方式 在实际编程中,约80%的情况使用flags=0,只有在需要特殊行为时才使用其他标志。默认行为(flags = 0)意味着:1.阻塞模式2.无特殊标志。

2025-12-27 15:33:04 742

原创 转义字符.

转义字符 是一种特殊的字符序列。它通常以一个反斜杠 开头,后跟一个或多个字符。它的主要作用是告诉编译器或解释器:“不要按字面意思理解我后面的字符,我有特殊的含义。,它让有限的键盘字符能够表示丰富多样的控制字符和符号。在字符串中,如果你想包含一个双引号,但双引号又是字符串的边界符,这时就需要转义。3. 一个易混淆的例子(\b 和 \r)(如换行、制表)时,使用对应的转义序列。表示无法直接键入或看到的“控制字符”转义字符的本质是一种“元编码”(如引号、反斜杠本身)。(如 \)时,需要转义。(如换行、制表符)。

2025-12-27 15:32:18 302

原创 Linux 地址转换函数详解

inet_ntoa 这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip 的结果. 那么是否需要调用者手动释放呢?man 手册上说, inet_ntoa 函数, 是把这个返回结果放到了静态存储区. 这个时候不需要我们手动进行释放.因为inet_ntoa 把结果放到自己内部的一个静态存储区, 这样第二次调用时的结果会覆盖掉上一次的结果.inet_addr() - 字符串转网络字节序(有缺陷)af:地址族(AF_INET或AF_INET6)

2025-12-20 19:12:31 516

原创 Socket 编程TCP:多线程远程命令执行

1. TCP 协议特点1. TCP 协议特点1.1 TCP 核心特性面向连接:需要三次握手建立连接可靠传输:通过序号、确认、重传等机制保证流量控制:通过滑动窗口控制发送速率拥塞控制:防止网络过载全双工通信:双方可同时发送和接收数据特性TCPUDP连接性面向连接无连接可靠性可靠不可靠传输效率较低较高数据边界字节流数据报适用场景文件传输、Web、邮件视频流、DNS、广播2. TCP Socket 编程模型2.1 服务器端流程。

2025-12-20 19:11:01 661

原创 Socket UDP 网络编程V2 版本- 简单聊天室

聊天室主体结果展示示例输出/dev/pts/2说明你现在正在 /dev/pts/2 这个终端里打字,它就是“你在输入的显示器文件”。

2025-12-15 19:55:35 368

原创 简单线程池实现(单例模式)

基本概念线程池是一种多线程处理形式,它预先创建一组线程并管理它们,避免频繁创建和销毁线程带来的性能开销。在 Linux 环境下,线程池(Thread Pool)是一种常用的并发编程模型,用于复用线程资源,避免频繁创建和销毁线程带来的性能开销。它特别适用于高并发、短任务的场景,比如 Web 服务器、数据库连接池、异步任务处理等为什么需要线程池降低资源消耗:重复利用已创建的线程提高响应速度:任务到达时可直接执行,无需等待线程创建提高线程可管理性:统一分配、调优和监控防止资源耗尽。

2025-12-15 19:54:31 968

原创 实现简单日志

IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。

2025-12-10 19:35:13 653

原创 信号量与基于环形队列的生产消费模型

一、信号量基本概念信号量(Semaphore)是操作系统提供的一种进程/线程间同步机制,用于控制对共享资源的访问。Linux 提供了两种主要的信号量实现:System V 信号量(了解)和POSIX 信号量。一、信号量基本概念1. 信号量核心思想信号量是一个计数器,用于表示可用资源的数量支持两个原子操作:P操作(wait/proberen):获取资源,信号量值减1V操作(signal/verhogen):释放资源,信号量值加1当信号量为0时,尝试P操作的进程/线程会被阻塞。

2025-12-10 19:34:29 766

原创 生产者消费者模型

生产者消费者模型是Linux并发编程中的经典模式,用于解决多线程/进程间数据共享和同步的问题。在这里我们实现基于BlockingQueue的生产者消费者模型。

2025-12-07 15:46:59 732

原创 线程同步与条件变量

1 为什么需要线程同步?当多个线程同时访问共享资源时,可能会出现:竞态条件:执行结果依赖于线程执行的顺序数据不一致:线程读取到中间状态的数据死锁:线程相互等待对方释放资源。

2025-12-06 21:32:37 1299

原创 力扣 15.三数之和(medium)(双指针)

k ,同时还满足 nums[i] + nums[j] + nums[k] == 0)的三元组,而在这些三元组中,重复的三元组因为数组有序而完全一样(包括顺序)然后把全部的三元组一股脑扔给set容器,set会帮我们完成去重,最后输出结果。1.先对数组排序,令其变为有序,固定左侧i,定义t=-num[i],定义left,right指针,l,r分别是其所指向的值,在[left,right]区间中遍历使l+r=t。当找到符合条件的三元组时,left,right要跳过重复元素s。解法二:排序+双指针。

2025-12-04 17:16:58 354

原创 mutex线程互斥

• 临界资源:多线程执行流共享的资源就叫做临界资源• 临界区:每个线程内部,访问临界资源的代码,就叫做临界区• 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用• 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成1.1 为什么需要互斥多个线程同时访问共享资源可能导致数据不一致竞态条件(Race Condition):执行结果依赖于线程执行顺序临界区(Critical Section):访问共享资源的代码段。

2025-12-04 17:14:25 450

原创 Socket UDP 网络编程V1 版本- echo server

IP 协议有两个版本, IPv4 和IPv6. 我们整个文章, 凡是提到IP 协议, 没有特殊说明的,默认都是指IPv4• 对于IPv4 来说,;• 我们通常也使用**“点分十进制” 的字符串用点分割的每一个数字表示一个字节, 范围是0 - 255;

2025-12-01 19:38:43 880

原创 Linux线程

• 在一个程序里的一个执行路线就叫做线程(thread)。• 一切进程至少都有一个执行线程• 线程在进程内部运行,本质是在进程地址空间内运行• 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化• 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流Linux 内核视角:在底层,Linux 内核并不严格区分进程和线程。它使用一种通用的结构 task_struct 来管理所有执行上下文。

2025-12-01 19:37:36 1211 1

原创 LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)(easy)(双指针)

l+r>t时,(数组是升序的,当l+r>t时,[left+1,right-1]区间中的任意值与r相加时都大于t,则相当于以r为锚点时与数组中的任何数相加时都大于t,r遍历完成,不满足条件)right–l+r<t时,(数组是升序的,当l+<t时,[left+1,right-1]区间中的任意值与r相加时都小于t,则相当于以l为锚点时与数组中的任何数相加时都小于t,l遍历完成,不满足条件)left++解法2:利用单调性使用双指针算法解决问题。l+r=t时,条件满足,返回结果。二:比较l+r与t的大小。

2025-11-20 20:58:28 181

原创 C++之引用

比如:水浒传中李逵,宋江叫"铁牛",江湖上人称"黑旋风";林冲,外号豹子头;

2025-11-20 20:57:06 678

原创 力扣611.有效三角形个数(medium)(双指针)

(则这三边可以组成三角形,又因为数组单调性,left右边的值都比a大,因此可以推断b和b左边的任何一个数相加时都大于c,则当9也固定时[2,5]都可以和9,10组成三角形,共有(right-left)种三元组可以组成三角形)(5已经是[2,5]区间中最大的数了,5+2<10,则5左边的数与2相加时更小于10,因此,left以2锚点时(10早已固定,不考虑)组成的三元组均不符合三角形的有效条件)一:固定10为三角形三边中最大的一条边,然后再从10的左边区间中选取符合条件的两边。(以9为锚点以枚举完了)

2025-11-18 15:08:45 293

原创 命名空间(namespace )

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

2025-11-18 15:08:06 552

原创 力扣11.盛水最多的容器(medium)(双指针)

通过这个规律,我们可以把两层for循环嵌套枚举优化为为双指针从两端开始分别向内枚举遍历,时间复杂度优化为O(n)在记录过程中我们可以定义一个体积最大值max,随时比较以替换max值,当数组遍历完成时,容器的最大体积也就找到了。显然,两个数组下标之差是容器长度,两个数中较小的那个为容器高度,要寻找容器的最大储水量,有两种方法。可见,当右边决定高度的指针不动时,左边指针无论怎么移动,v都会减小。1.下一个数比4大或等于4,那么h不变,w减小->v减小。2.下一个数比4小,那么,h减小,w减小->v减小。

2025-11-13 14:58:49 452

原创 Linux进程信号(贰):保存信号

1.信号相关常见概念1.信号相关常见概念什么是信号保存?信号保存是指内核在信号产生到递送之间,对信号状态和信息进行维护的过程。当信号无法立即被进程处理时,内核需要暂时保存这些信号。信号的生命周期:信号产生→信号保存→信号递送(处理)信号的三个状态产生(Generation):信号被某个事件或进程创建未决(Pending):信号已产生但尚未递送给目标进程递送(Delivery):信号被目标进程接收并处理• 实际执行信号的处理动作称为信号递达(Delivery)

2025-10-23 20:46:59 1047

原创 力扣202.快乐数(medium)(双指针)

看到这幅图是不是很熟悉,一下就想到了链表中快慢指针判断是否循环,只不过这道题不用判断是否循环,而是确定是循环的,我们要判断的是快慢指针相遇时其对应的值是否为1,其中,指针为数,slow指针一次变化一次,fast指针一次变化两次。实际上我们可以把这两个例子都看成一种无限循环的类型,只不过符合条件时循环的数一直是1,不符合条件时循环的数不是1 如下图。我们可以看到,第一个例子到最后符合条件,变为1,第二个例子不符合条件,从4开始无限循环。我们先用给出的两个例子看一下。

2025-10-21 16:59:07 357

原创 力扣1089.复写零(easy)(双指针)

如果是 0 : dest 以及 dest - 1 位置修改成 0 , dest -= 2;如果非零: dest 位置修改成 0 , dest -= 1;• 判断 dest 是否已经到结束位置,如果是结束就终止循环;◦ 如果是 0 的话, dest 往后移动两位;• 如果没有结束, cur++ ,继续判断。ii. cur-- ,复写下一个位置。◦ 否则, dest 往后移动一位。dest如果越界,则cur值一定是0。n - 1 位置的值修改成 0;这样,我们可以总结出结题步骤。cur 向移动一步;

2025-10-21 11:20:04 497

原创 Linux进程信号(壹)_产生信号

1. 什么是信号?1. 什么是信号?信号是一种异步事件通知机制,用于在操作系统内核、进程、或进程自身之间传递一个简单消息,通知进程某个特定事件已经发生。您可以把它想象成现实生活中的中断或警报。比如,你正在工作,突然手机响了(一个信号),你需要决定是接听(处理)、忽略还是直接挂断(默认操作)。

2025-10-19 21:50:16 389

原创 进程间通信:system V共享内存

1.什么是共享内存?1.什么是共享内存?共享内存是Linux系统中最高效的进程间通信(IPC)方式之一,它允许多个进程访问同一块物理内存区域,从而实现数据共享。system V是进程间通信的一种标准共享内存的优势:高性能:数据不需要在进程间复制低延迟:直接内存访问大容量:可以共享大量数据1.2共享内存示意图进程间通信的前提是让不同的进程看到同一份资源,共享内存技术也是基于此前提设计的这两个步骤都是有OS完成的,需要使用系统调用。

2025-10-14 16:32:07 411

原创 进程间通信_管道

• 数据传输:一个进程需要将它的数据发送给另一个进程• 资源共享:多个进程之间共享同样的资源。• 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。• 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

2025-10-10 20:15:27 986

原创 力扣:283.移动零(easy)(双指针)

令**des++,swap(des,cur),cur++,**这样便能保证三个区域的原则。首先要确保一个原则,遍历过程中数组始终明确的分为三个区间,任何操作都是为这个原则服务。,根据之前的区域划分,des为已处理的区间内最后一个非零元素的位置,则des+1为0。cur:从左向右扫描数组 des:已处理的区间内最后一个非零元素的位置。[0,cur-1]:已处理的部分 ** [cur,n-1]未处理的部分****cur遇到0元素时,cur++,**除此之外,什么也不做。设两个指针,cur,des。

2025-10-10 11:15:08 224

原创 文件基础(2):系统文件 (1)

我们平时打开文件用的都是fopen,这其实是语言层面上的,底层封装了系统调用open,接下来,我们来学习系统层面上的打开文件。

2025-09-14 19:47:47 594

原创 文件基础(1)

通过 fopen创建的新⽂件通常具有 0666的权限(即 rw-rw-rw-),但这个值会受当前进程的 umask 设置影响(常⻅的效果是屏蔽掉组和其他⽤户的写权限,例如最终权限为 rw-r–r–)。• 文件的读写本质不是通过 C 语言 / C++ 的库函数来操作的(这些库函数只是为用户提供方便),而是通过文件相关的系统调用接口来实现的(库函数底层封装的是系统调用接口)打开文件,本质是进程打开,所以,进程知道自己在哪里,即便文件不带路径,进程也知道。这些都是抽象化的过程),是“关于文件的信息”。

2025-09-14 19:47:03 967

原创 进程控制之进程程序替换

基本概念在 Linux 系统中,进程程序替换是指一个正在运行的进程将其当前执行的程序完全替换为另一个程序的过程。这是通过 exec系列函数实现的,它们允许进程加载并运行不同的可执行文件。基本概念进程程序替换的特点:替换后,进程ID保持不变原进程的代码段、数据段和堆栈被新程序替换。

2025-09-08 19:12:44 767

原创 进程控制之进程等待

• 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。• 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。• 最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。• 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息在进程等待中,回收子进程资源是必须的,获取子进程退出信息是可选的,因为有些进程不需要退出消息。

2025-09-08 19:12:09 1093

原创 进程控制之进程创建与终止

在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。父进程调用fork后,内核做:• 分配新的内存块和内核数据结构给子进程• 将父进程部分数据结构内容拷贝至子进程• 添加子进程到系统进程列表当中• fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序。这里看到了三行输出,一行before,两行after。

2025-09-01 20:56:31 915

原创 回车换行、缓冲区刷新、倒计时小程序

回车换行并不是一个概念,回车是把光标移动到最开始的位置,换行是将光标移动到下一行\r是回车符 \n是换行符,不过在语法上单独的换行没有意义,因此\n是回车换行两个功能的结合。

2025-08-29 16:55:45 511

原创 程序(进程)地址空间(1)

• 地址空间和页表是OS创建并维护的!是不是也就意味着,凡是想使用地址空间和页表进行映射,也一定要在OS的监管之下来进行访问!!也顺便,包括各个进程以及内核的相关有效数据!保护了物理内存中的所有的合法数据• 因为有地址空间的存在和页表的映射的存在,我们的物理内存中可以对未来的数据进行任意位置的加载!物理内存的分配 和 进程的管理就可以做到没有关系,进程管理模块和内存管理模块就完成了解耦合(这样两个模块出问题时就不会影响到彼此)

2025-08-27 20:17:38 682

原创 命令行参数和环境变量

在 Linux 命令行中,参数是用户在执行命令时提供的额外信息,用于修改命令的行为或指定操作对象main函数可以有参数吗?当然可以在 C 和 C++ 语言中,main 函数可以有以下几种参数形式:标准参数形式无参数形式标准双参数形式这是最常用的形式,允许程序接收命令行参数。

2025-08-11 10:21:53 980

原创 进程初识之进程优先级与进程调度

进程优先级是进程得到某种资源的先后顺序。

2025-08-02 16:23:12 838

原创 进程初识之进程状态

什么叫做进程状态?状态,决定了进程接下来要做的工作下面这张图就是操作系统的状态转换图所有操作系统在实现进程状态变化的时候都要符合上面的理论下面给出这七种状态的概念核心进程状态(经典五状态模型)新建 (New)进程正在被创建(加载程序代码、分配内存等)。尚未准备好执行。就绪 (Ready)进程已获得除 CPU 之外的所有必要资源。它已加载到内存中,等待操作系统调度器分配 CPU 时间片。系统中通常有多个进程处于就绪状态,它们排在一个或多个就绪队列中等待调度。

2025-08-01 11:02:53 1327

原创 进程初识之进程查看

• 课本概念:程序的一个执行实例,正在执行的程序等• 内核观点:担当分配系统资源(CPU时间,内存)的实体。在教材中对进程的概念是运行起来的加载到内存的程序但实际上并不只是这样我们都知道在操作系统中会存在很多进程,这些进程需要被妥善管理,那么该怎么管理呢?答案是:先描述(用结构体描述进程的相关属性),再组织(用数据结构(如链表)将众多结构体组织起来)这样,对进程的管理就变成了对链表的增删查改。

2025-07-30 18:00:17 1349

原创 操作系统概述(Linux、如何理解_管理_)

💡关键:管理的目标是解决“有限资源” vs “无限需求”的矛盾。终极目标:从“管理”到“服务”操作系统的管理不是目的,而是手段,最终指向“为用户程序提供高效、稳定的执行环境”对下:驯服硬件,隐藏复杂性 →“不用关心硬盘转速是多少”。对上:提供服务,支撑应用 →“点击图标就能运行程序”。

2025-07-27 16:45:30 661

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除