自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程间通信-命名管道学习

本文介绍了命名管道的创建和使用方法。命名管道(FIFO)突破了匿名管道只能在亲缘进程间通信的限制,通过在文件系统中创建特殊文件实现无关进程间的通信。文章详细说明了两种创建方式:命令行使用mkfifo命令和程序调用mkfifo函数,并对比了匿名管道与命名管道的区别。重点阐述了命名管道的打开规则,包括阻塞和非阻塞模式下的行为差异。最后通过server和client的代码示例,展示了如何使用命名管道实现进程间通信,包括管道的创建、打开、读写操作等完整流程。这些内容为理解和使用命名管道进行进程间通信提供了实用指导。

2025-12-14 17:03:17 221

原创 进程间通信-对匿名管道的学习

本文摘要: 进程间通信(IPC)是操作系统中的重要机制,主要用于数据传输、资源共享、事件通知和进程控制。文章系统介绍了IPC的发展历程(管道→System V→POSIX)和分类方法,重点讲解了管道通信的实现原理。通过文件描述符角度详细解析了父子进程间匿名管道的工作机制,并提供了C++代码示例演示管道读写操作。此外,文章还展示了如何构建进程池来处理任务,包括Channel类和ProcessPool类的实现,涉及进程创建、管道通信、任务派发等关键技术。最后通过一个循环派发任务的示例,说明了如何利用进程池实现多

2025-11-30 20:37:53 849

原创 Linux - 库制作与原理

本文介绍了静态库和动态库的基本概念及实现方法。主要内容包括:库代码准备(演示了自定义stdio.h和string.h的实现),静态库生成和使用(通过makefile创建.a文件,展示三种不同路径下的编译链接方式),以及动态库生成(使用-shared和-fPIC选项创建.so共享库)。文章重点讲解了库的二进制形式、编译链接参数、路径管理等问题,并展示了如何通过makefile自动化构建过程。通过实际代码示例,帮助读者理解两种库的特点和适用场景,包括静态库的独立性和动态库的共享优势。

2025-11-16 10:18:18 803

原创 Linux - 文件系统

本文摘要: 磁盘存储结构主要由磁头(head)、磁道(track)、柱面(cylinder)和扇区(sector)组成。每个盘片有上下两面对应两个磁头,磁道从外向内编号,柱面由半径相同的多个磁道组成。扇区是读写的最小单位(512字节)。磁盘容量计算公式为:磁头数×柱面数×每磁道扇区数×每扇区字节数。操作系统通过CHS(柱面-磁头-扇区)或LBA(逻辑块地址)两种方式寻址,两者可相互转换。文件系统将多个扇区组成块(通常4KB),作为文件存取的最小单位。Linux系统采用inode结构存储文件属性信息(如权限、

2025-11-09 16:11:17 593

原创 Linux-基础Io

本文探讨了文件系统的核心概念与操作。从狭义上看,文件是存储在磁盘上的永久性数据,本质是对外设的IO操作;广义上Linux系统中一切皆文件。文件由属性和内容构成,所有操作都围绕这两方面展开,而实际读写是通过系统调用而非语言库函数实现的。文章回顾了C语言文件操作接口,包括fopen、fwrite、fread等读写方法,并展示了简单cat命令的实现。同时介绍了标准输入输出流(stdin/stdout/stderr)和多种文件打开模式(r/r+/w/w+/a/a+)。最后提及系统级文件IO接口中传递标志位的位操作方

2025-11-02 11:03:36 933

原创 C++ - stack和queue

栈的基本概念与操作 摘要:栈(stack)是一种遵循后进先出(LIFO)原则的数据结构,主要操作包括压栈(push)、出栈(pop)、访问栈顶(top)和判断空栈(empty)。本文通过C++代码示例演示了标准库stack的基本操作,并提供了使用vector模拟实现栈结构的方法。示例代码展示了栈的创建、元素压栈/出栈、访问栈顶元素、获取栈大小等核心功能,同时包含辅助函数以可视化栈的内容变化。模拟实现部分通过封装vector实现了与STL stack相同的接口,验证了栈与vector的密切关系。

2025-10-26 12:26:55 343

原创 C++ - C++11拓展

本文介绍了C++11中的列表初始化、右值引用和移动语义等新特性。列表初始化通过大括号{}实现了统一的初始化方式,支持内置类型和自定义类型,并通过initializer_list类简化了容器初始化。右值引用区分左值(可取地址)和右值(不可取地址),通过移动语义避免深拷贝,提高性能。移动语义包括移动构造函数和移动赋值函数,使用右值引用实现资源转移而非复制。这些特性使代码更简洁高效。

2025-10-26 12:25:12 856

原创 C++ - 异常

异常处理机制允许程序在运行时检测和处理问题,将问题检测与解决过程分离。C++通过throw抛出异常对象,通过catch捕获匹配类型处理异常,支持派生类到基类的类型转换。栈展开过程会沿调用链查找匹配的catch子句,未捕获则终止程序。异常处理时控制权转移,调用链中的对象将被销毁。建议使用继承体系组织异常类,并通过基类引用捕获多种异常。相比C语言的错误码方式,异常处理能更高效直接地传递错误信息。

2025-10-25 12:41:36 954

原创 C++ - 多态

本文介绍了C++多态的基本概念和实现方式。多态分为编译时多态(函数重载和模板)和运行时多态。运行时多态通过虚函数、继承体系和指针/引用调用实现,需要满足基类指针/引用调用虚函数和虚函数重写两个条件。文章详细讲解了虚函数重写、协变、override/final关键字的使用,并对比了重载、重写和隐藏的区别。最后介绍了纯虚函数和抽象类,说明纯虚函数强制派生类重写虚函数的特性。全文通过代码示例演示了多态的具体实现和应用场景。

2025-10-24 17:52:26 614

原创 C++ - 继承

本文介绍了面向对象编程中的继承概念及其应用。继承允许派生类复用基类的属性和方法,同时扩展新功能,形成层次结构。通过Person、Student和Teacher类的示例,展示了如何通过继承消除冗余代码。文章详细说明了继承的三种访问方式(public/protected/private)及其对成员可见性的影响,重点指出基类private成员在派生类中不可见。此外,还介绍了继承类模板的实现方法、基类与派生类间的赋值转换规则,以及继承中的隐藏规则(同名成员会屏蔽基类成员)。最后强调实际开发中应避免定义同名成员以确保

2025-10-23 11:08:43 902

原创 C++ - 模板进阶

本文介绍了C++中的非类型模板参数和模板特化技术。非类型模板参数允许在编译时传递整型、指针、引用等常量值作为模板参数,并展示了整型、指针、引用、枚举、浮点(C++20)和类类型(C++20)等非类型参数的用法示例。模板特化部分则针对特定类型提供特殊实现,包括函数模板特化和类模板全特化,通过日期比较案例演示了指针类型特化的实际应用,解决了通用模板无法正确处理指针比较的问题。这些技术能优化特定场景下的模板行为,提高代码的灵活性和精确性。

2025-10-20 19:16:38 992

原创 C++ - List

C++ STL中的List是一个双向链表容器,具有高效的插入/删除操作。它采用双向链表数据结构,每个节点包含数据值、前后指针,支持双向遍历和动态大小调整。主要特性包括非连续存储、无随机访问和稳定的迭代器。常用操作包括多种构造函数、迭代器遍历(正向/反向)、容量查询(empty/size)等。需要注意的是,删除操作会导致被删除节点的迭代器失效,需通过it++或erase返回值更新迭代器。List特别适合频繁修改序列中间元素的场景,但相比数组访问效率较低。

2025-10-18 20:27:07 1339

原创 Linux - 进程控制

本文介绍了Linux中进程创建、终止和等待的相关机制。主要内容包括:1)使用fork()创建子进程及其特性,如写时拷贝机制;2)进程终止的三种场景及退出方法(return、exit、_exit),详细解释了退出码含义;3)进程等待的必要性,介绍了wait()和waitpid()两种等待方法及其参数使用。文章通过代码示例和图表展示了父子进程关系、退出状态获取等关键概念,帮助理解进程生命周期管理。

2025-10-17 20:17:19 632

原创 C++ - vector

本文介绍了C++标准模板库中的vector容器。vector是动态数组,支持自动扩容,常用于存储同类型元素。文章详细讲解了vector的四种构造函数(无参构造、数量值构造、拷贝构造和迭代器构造)及其代码示例,并介绍了正向和反向迭代器的使用方法。最后简要提及了vector的容量相关接口,如size()函数。通过具体代码展示了vector的基本操作,帮助读者快速掌握这一常用容器的使用方法。

2025-10-14 17:06:47 596

原创 Linux - 命令行参数与环境变量

本文介绍了命令行参数和环境变量的基本概念与应用。命令行参数是程序运行时通过终端传递的输入数据,由argc(参数个数)和argv(参数数组)组成,用于动态调整程序行为。环境变量是系统配置的键值对,如PATH、HOME等,可通过echo、env等命令查看和修改。文章还演示了如何通过代码获取环境变量(使用main函数的第三个参数或environ变量),并说明环境变量具有全局属性,可被子进程继承。测试案例展示了PATH和HOME变量的实际应用。

2025-10-12 20:41:10 950

原创 Linux -程序地址空间

程序地址空间是操作系统为每个进程分配的虚拟内存区域,包含代码、数据、堆栈等信息,实现进程隔离。通过示例代码展示了不同变量在地址空间中的分布(代码段、数据段、堆区、栈区等)。fork实验证明父子进程的变量地址相同但值不同,说明使用的是虚拟地址而非物理地址。进程地址空间由mm_struct结构体管理,每个进程拥有独立的虚拟地址空间映射到物理内存,由操作系统负责转换。这种机制保证了进程间的内存隔离和保护。

2025-10-12 20:40:03 936

原创 C++ - string类

本文介绍了C++标准库中的string类,包括其基本概念、语法补充(auto关键字和范围for循环)以及常用接口。文章详细说明了string对象的创建方法、容量操作(size()、clear()、resize()等)以及访问遍历方式(operator[]、迭代器、范围for)。通过代码示例展示了各种接口的使用场景和注意事项,如size()与length()的区别、reserve()的功能限制等。

2025-10-10 00:56:50 805

原创 Linux - 进程优先级、进程切换和调度队列

Linux学习笔记

2025-10-05 13:37:43 909

原创 Linux - 进程状态

Linux学习笔记

2025-10-05 13:31:42 859

原创 C++ - 模板初阶

C++模板学习笔记

2025-10-03 01:03:08 707

原创 Linux学习-进程概念

Linux学习笔记

2025-09-29 19:34:37 466

原创 C++学习 - 内存管理

C++学习笔记

2025-09-29 19:30:46 596

原创 C++学习-->类和对象

class 作为类的关键字,在关键字后加上类的名字,{} 中为类的主体,且类定义结束后的分号不能省略。类中的内容作为类的成员:类中的变量作为类的属性或成员变量、类中的函数称为类的方法或成员函数。为区分成员变量,一般会在成员变量上加上特殊标识,如成员变量面前或后面加 _ 或 m 开头。在C++中 struct 也可以定义类,明显的变化是 struct 中也可以定义函数,但一般情况下还是推荐 class 定义类。类的成员函数默认为内联函数( inline )。int _x;int _y。

2024-10-13 23:59:21 1082

原创 C++学习-->基础

引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会为引用变量和开辟内存空间,而是和引用的变量共用同一个内存空间,就比如秦始皇和嬴政都指向同一个人。引用的底层代码也是通过指针实现的类型& 引用别名 = 引用对象;//可以看出 a、b 的地址是相同的,a 、b共用同一个空间++b;//这里不是新建引用别名,而是给 c 赋值return 0;

2024-09-17 09:43:28 808 1

原创 C学习(数据结构)-->排序

这样的统计有缺点,第一,如果原数组中最小值为1000,那么就会新申请的数组中,就会至少申请1000个以上的空间,又由于最小值为1000,那么下标前1000个空间就会用不上,会很大程度上浪费空间。通过递归,将一个无序数组分为两个长度相同或者相近的数组,然后在分好的数组再次各自分两个数组,反复操作,直到数组不能再分为止,此时递归开始返回,在返回前,将数组按数据从小到大两两合并,当递归结束时,排序完成。作为下标,那么最后将统计好的数组拷贝回去原数组时,是将下标加上原数组中数据的最小值。测试各个排序的运行效率。

2024-09-07 10:43:19 1263

原创 C学习(数据结构)-->实现链式结构二叉树

遍历完 6 结点,再次返回 2 结点,此时 2 结点的左右孩子结点都遍历完,所以返回 1 结点,此时 1 结点的左孩子结点已经遍历完成,则遍历1 结点的右孩子结点,即 3 结点。与层序遍历类似,不同的是,取消了判断左右孩子结点是否为空结点,所以就算左右孩子结点为空值结点也会入队列,所以不完全二叉树会出现这种情况。此时4结点已经遍历完,放回 2 结点,因为 4 结点是 2 结点的左孩子结点,开始遍历 2 结点的右孩子结点,即标号为 6 的结点。标号为 2 的结点作为新的根结点,遍历 2 结点,且打印。

2024-08-22 11:14:08 1237

原创 C学习(数据结构)--> 实现顺序结构二叉树

一般堆使用顺序结构的数组来存储数据,堆是一种特殊的二叉树。具有二叉树的特性的同时,还具有其它的特性。

2024-08-22 11:13:50 1159

原创 C学习(数据结构)-->二叉树

对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与度为 K 的满二叉树编号从 1 至 n 的结点一一对应时称之为完全二叉树。即一个二叉树是结点的一个有限集合,由一个根结点加上两棵别称为左子树和右子树的二叉树组成或者为空。也就是说,如果这个二叉树的层数为 K ,且结点总数是 2^k-1,那么它就是满二叉树。一般把堆(一种二叉树)使用顺序结构的数组来存储,要注意的是,这里的堆和操作系统虚拟进程地址空间中的堆是两回事,这里的堆是指数据结构。例如:深度为3,有6个结点的完全二叉树。

2024-08-22 11:13:19 811

原创 C学习(数据结构)-->队列

由于单链表结构的特殊性,导致进行入队操作的时候,得先遍历一遍单链表,才能在队尾进行结点的插入,时间负复杂度为 O( n ) ,所以要建立一个新的结构体来保存单链表的第一个结点和最后一个结点,把时间复杂度降为 O(1) ,则优化后的队列结构。只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,遵循先进先出的结构。单链表的第一个结点当做队头,最后一个节点当做队尾,且单链表结点的结构。本文章通过单链表实现队列,单链表详情见。入队列:进行插入操作的一端叫作队尾。出队列:进行删除操作的一端叫做队头。

2024-07-28 14:26:00 728

原创 C学习(数据结构)-->栈

栈是一种特殊的线性表,只允许在固定的一段进行元素的插入和删除。进行数据插入和删除的一端称作栈顶,另一端称为栈底。栈的数据元素遵循后进先出的原则。压栈:栈的插入操作叫做 进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。栈一般通过数组(顺序表)或链表实现。本文章通过顺序表实现栈,顺序表详情见。

2024-07-22 07:42:25 420

原创 C学习(数据结构)-->双向链表

链表的分类,一共有(单向 / 双向) x(带头 / 不带头)x(循环 / 循环)<=>2x2x2 = 8(种)本文章主要讲述双向循环带头链表。

2024-07-18 09:03:17 739

原创 C学习(数据结构)-->单链表习题

当 N 为奇数时,(x+1)*C一定为奇数,即 C 为奇数,不存在step1中 N为奇数,C为偶数 的情况,则两指针一定会相遇。设慢指针为 slow ,快指针为 fast ,头结点到入环点的长度为 L,环的长度为 C ,则当 slow 到达入环点时,从 fast 到达 slow 的长度为 N ,则。此时变为追击问题,快指针一次走两步,慢指针一次走一步,没走一步,快慢指针之间的距离减一,即:N,N-1,N-2,N-3......3,2,1,0,两指针相遇。取快指针一次两步,慢指针一次一步,可得方程式。

2024-07-17 16:04:54 766

原创 C学习(数据结构)->单链表

pcur 获取头结点地址,通过 pcur 打印当前结点保存的数据。然后将当前结点保存的,下一结点的地址赋值给 pcur ,通过 pcur 继续往下打印。链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。当需要寻找到下一个结点时,只需要通过当前结点保存的 next 地址寻找到下一个结点。与顺序表不同的是,保存每一个数据都需要单独申请空间,每一个申请下来的空间称为结点。结点由要 保存的数据 和 下一个结点的地址 两部分组成。

2024-07-16 08:49:12 374

原创 C学习(数据结构)-->顺序表

顺序表空间不够时,插入数据一次就调用 realloc 函数扩容一次,当要插入数据增多时,就会浪费跟多的时间,时间复杂度会大大增加,所以使用倍数地扩容空间,多余的空间忽略不计。顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储,对数组封装,实现了常用的增删查改等接口。线性表是n个具有相同特性的数据元素的有限序列,是在实际中广泛应用的数据结构。缺点:空间给少了不够用,给多又会造成空间浪费。静态顺序表是使用定长数组存储元素的顺序表。顺序表分为静态顺序表和动态顺序表。

2024-07-12 07:00:00 827

原创 C学习(数据结构)-->算法复杂度

在计算机科学中,算法的时间复杂度是一个函数式 T( N ) ,定量描述了算法的运行时间。时间复杂度是衡量程序的时间效率,而不是去计算程序的运行时间,因为在不同的环境下同一个程序的运行时间不同,且时间只能写好后测试,不能在写程序前进行理论上的思想计算评估。空间复杂度指的是对一个算法在运行中因为算法需要额外临时开辟的空间。空间复杂度计算规则基本和时间复杂度类似,也使用大O渐近表示法。

2024-07-11 11:08:24 598

原创 C语言学习—编译和链接

语义分析器对表达式的语法分析后进行的语义的静态分析。汇编器将汇编代码转变成机器指令,一个汇编语句对应一个机器指令,根据汇编指令和机器指令的对照表一一进行翻译,不做指令优化。扫描器对源程序进行词法分析,把代码中的字符分割成一系列的记号,即关键字、标识符、字面量、特殊字符等。将一堆文件链接在一起生成可执行程序,链接用于解决一个项目中多文件、多模块之间互相调用的问题。语法分析器度扫描产生的记号进行语法分析,产生以表达式为节点的语法数。在预处理阶段,源文件和头文件会被处理成 .i 为后缀的文件。

2024-06-10 03:30:04 460

原创 c语言学习—文件操作

程序文件和数据文件程序文件程序文件包括源程序文件(后缀为 .c ),目标文件(windows环境后缀为 .obj),可执行程序(windows环境后缀为 .exe)数据文件文件的内容不一定是程序,而是程序运行时读写的数据。

2024-06-09 18:31:09 1080

原创 C语言学习—结构体

对齐数最大的是 int 类型的 b ,对齐数为 4 ,从上面来看结构体目前申请的内存为 9 个字节,不是 4 的整数倍,还要在扩大到 12 个字节,才是该结构体的总大小。第三个结构体成员 c 占 5 个比特位,空间不够取,所以假设原先剩余的那一个比特位的空间直接浪费,再向内存申请一个字节的空间,把 c 放进去。创建结构体变量时,为本身申请内存空间的同时,又为结构体变量内部的结构体变量申请空间,无限地申请空间下去,这样的变量是无穷大的。结构是值的集合,这些值称为成员变量,成员变量类型可以不同。

2024-05-25 23:36:43 876

原创 C语言学习—俄罗斯方块

define row 28 //游戏行数#define col 18 //游戏列数#define ROW row+2 //游戏方框行数,包括提示区等#define COL col+12 //游戏方框列数,包括提示区等//将方块旋转保存在dia中i < 4;i++)j < 4;j++)#define row 28 //游戏行数#define col 18 //游戏列数#define ROW row+2 //游戏方框行数,包括提示区和分数区。

2024-05-23 15:44:07 2942 4

原创 C语言学习—数据在内存中的储存

在计算机中,整形数据是用补码来储存的,因为CPU中只有加法器,而补码可以使加减法统一处理,而且补码和原码相互转换(负数是先对补码除符号位外的其他位进行按位取反,然后给反转后的数加1)的过程是相同的,不需要添加额外的硬件。对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

2024-05-22 23:33:00 718 1

空空如也

空空如也

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

TA关注的人

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