自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】进程通信

进程间通信的必要性与实现方式 进程间通信(IPC)是实现多进程协作的关键机制,其必要性源于进程独立性与系统协同需求的矛盾。Linux系统中主要通过管道实现进程间通信,分为匿名管道和命名管道两种形式。 匿名管道的核心原理是利用内存级文件实现数据共享,通过fork()创建的子进程继承父进程的文件描述符,使父子进程共享同一内核缓冲区。管道采用半双工通信模式,要求通信双方固定读写角色,通过关闭不需要的文件描述符确保单向通信。其特点包括: 仅适用于有亲缘关系的进程 通信数据不持久化,随进程结束而释放 采用阻塞式读写机

2025-08-04 03:41:54 612

原创 【Linux】基础IO

文件操作与C语言文件函数摘要 文件是存储在外部介质上的数据集合,由文件名标识。即使空文件也会占用存储空间,因为需要保存文件属性。文件可分为打开和未打开两种状态:未打开文件存储在外设(如硬盘)中,打开文件则被加载到内存并由进程管理。 C语言提供多种文件操作函数: fopen() - 打开文件,支持多种模式(r/r+/w/w+/a/a+) fclose() - 关闭文件流 fwrite() - 向文件写入数据 fread() - 从文件读取数据 文件操作模式决定了行为特点:w模式会清空文件内容再写入,a模式则在

2025-07-27 03:44:25 890

原创 【Linux】进程详解

本文介绍了进程的概念及其管理机制。进程是程序执行的实例,由进程控制块(PCB)、代码和数据组成,是操作系统资源分配的基本单位。Linux中的PCB称为task_struct,以链表等多种形式组织。查看进程常用ps、top命令和/proc目录。通过fork()系统调用可创建子进程,父子进程共享代码段但数据段采用写时拷贝机制保持独立。bash进程作为命令行解释器,是用户创建进程的父进程。操作系统采用"先描述再组织"的管理思路,将抽象资源转化为统一数据结构进行管理。

2025-07-17 02:43:33 750

原创 【Linux】冯诺依曼体系

冯诺依曼体系是现代计算机的基础架构,由输入设备、输出设备、存储器、运算器和控制器五大模块组成。存储器(内存)作为数据中转站,运算器和控制器构成CPU核心。存储金字塔展示了计算机存储层级结构,通过成本与性能的平衡优化CPU利用率。Linux系统则采用分层管理,硬件驱动按标准提供信息,操作系统通过系统调用接口管理硬件,为用户提供安全稳定的执行环境,最终用户通过封装后的指令进行操作。该体系奠定了计算机软硬件协同工作的理论基础。

2025-06-22 14:53:31 779

原创 【Linux】gdb调试器

本文介绍了GNU调试工具gdb的基本使用方法。gdb是Linux系统下功能强大的命令行调试工具,主要用于C/C++程序的调试。文章详细讲解了如何编译debug版本程序、进入和退出调试状态、代码打印、运行程序、打断点管理(包括查看、启用/禁用断点)、逐过程(n)和逐语句(s)调试技巧。此外还涵盖了变量打印与监控、快速跳过代码段(until)、函数快速执行(finish)、修改变量值(set var)以及查看调用堆栈(bt)等实用功能。这些功能帮助开发者高效定位程序错误,尤其适合Linux环境下文本界面的调试工

2025-06-21 17:17:02 766

原创 【Linux】git基础操作

本文介绍了Git的基本概念及其在Linux环境下的使用。Git是一款强大的代码历史管理和团队协作工具,能够跟踪文件变化并记录完整修改历史。文章详细讲解了如何在Linux上安装Git、配置用户信息、本地仓库初始化、文件提交等基础操作,并说明了如何将代码托管到远程仓库(如Gitee)。此外,还介绍了.gitignore文件的作用及使用方法,帮助过滤无需版本控制的文件。通过这篇指南,读者可以快速掌握Git的核心功能和使用流程,提高代码管理效率。

2025-06-13 13:32:00 987

原创 【Linux】Makefile

Makefile是一种自动化构建工具,用于管理项目的编译和链接过程。文章介绍了Makefile的基本格式、工作原理及优化技巧。主要内容包括: 基本格式:目标文件与依赖文件的定义及编译指令 特殊符号使用:$@表示目标,$^表示依赖文件 文件时间机制:系统通过比较文件修改时间决定是否重新编译 伪目标声明:.PHONY用于定义总是执行的指令(如clean) 多层依赖:展示如何分步实现从源代码到可执行文件的完整编译流程 文章通过实例演示了Makefile的使用方法,并强调了合理使用.PHONY的重要性,同时解释了系

2025-06-09 23:55:19 975

原创 【Linux】gcc、g++编译器

GCC和G++是Linux中常用的C/C++编译器,GCC专用于C语言,G++兼容C和C++。编译过程分为预处理(去注释、宏替换等)、编译(生成汇编代码)、汇编(生成机器码)、链接(连接库函数)。Linux默认使用动态链接库(共享库),节省内存但依赖性强;静态链接库独立但占用空间大。可通过安装静态库并使用-static选项进行静态编译。文件后缀(如.i、.s、.o)有助于编译器识别处理阶段,file指令可查看文件详细信息。

2025-06-08 12:41:42 1169

原创 【Linux】centos软件安装

摘要:本文介绍了Linux系统下三种安装软件的方法,重点推荐适合初学者的yum工具。yum是基于RPM包管理的前端工具,能自动解决依赖关系,常用指令包括安装(yum install)和卸载(yum remove)。文章演示了通过yum安装lrzsz文件传输软件的过程,并讲解了yum源配置文件的位置和作用。此外还介绍了如何配置epel-release第三方软件源来扩展可用软件库。最后说明通过yum list可查看可用软件列表,其中@os表示官方源,epel表示第三方源。

2025-06-04 17:41:13 1057

原创 【Linux】Linux权限

Linux用户与文件权限管理摘要 Linux系统包含root和普通用户两种账户类型,root拥有最高权限。用户切换可通过su命令(su -切换完整环境)或sudo临时提权(需在白名单中)。文件权限由拥有者、所属组和其他用户三角色构成,通过ls -l查看的9位权限字符分别对应三类角色的读写执行权限(rwx)。权限修改工具包括: chmod(字符/八进制形式修改权限) chown(修改所有者,需root权限) chgrp(修改所属组,需root权限) 新建文件默认权限受umask影响(默认002),目录初始77

2025-06-04 11:49:08 1068

原创 【Linux】linux基础指令

本文介绍了Linux系统中常用的用户管理和文件操作命令,主要包括: 用户管理命令: useradd:创建新用户 passwd:设置用户密码 userdel:删除用户(建议使用-r选项递归删除) 文件操作命令: ls:列出目录内容(常用选项:-a显示隐藏文件、-l显示详细信息) pwd:显示当前目录 cd:切换目录 touch:创建新文件 mkdir:创建目录(-p可创建多级目录) rm:删除文件/目录(-r递归删除) cp:复制文件/目录 其他实用命令: man:查看命令手册 路径说明:解释了绝对路径和相对

2025-06-03 12:13:29 978

原创 【c++】【数据结构】红黑树

红黑树是一种通过颜色标记节点来维持平衡的二叉搜索树,其核心规则包括:根节点为黑色、红节点的子节点必须为黑、从任一节点到叶节点的路径包含相同数目的黑节点。这些约束确保最长路径不超过最短路径的两倍。文章给出红黑树的部分C++实现代码,包含节点插入逻辑和四种旋转操作(左旋、右旋、左右旋、右左旋)来维护平衡。代码中还实现了平衡性检查功能,通过递归验证颜色规则和黑节点计数一致性。红黑树通过这种机制在动态操作中保持高效查找性能,时间复杂度稳定在O(log n)。

2025-05-28 15:09:30 985

原创 【c++】【数据结构】AVL树

AVL树是一种自平衡二叉搜索树,通过平衡因子和旋转操作动态维持平衡,解决了普通二叉搜索树在极端情况下效率低下的问题。本文介绍了AVL树的基本概念,并给出了C++的部分实现代码,包括节点定义、插入操作以及四种旋转操作(左旋、右旋、左右旋和右左旋)的实现逻辑。实现中通过平衡因子判断和调整树的结构,确保插入后仍保持平衡特性。代码还包含中序遍历、树高计算和平衡检查等辅助功能,为构建高效的搜索数据结构提供了基础实现框架。

2025-05-28 00:41:33 954

原创 【c++】异常详解

C语言处理错误的方式存在局限性,主要通过assert和打印错误码来实现。assert在debug版中有效,但在release版中无效,且直接终止程序的方式过于暴力。打印错误码的方式虽然不会终止程序,但错误码可读性差,且全局变量errno容易被覆盖,导致错误处理繁琐。C++引入了异常机制来替代C语言的错误处理方式,异常通过throw、try和catch关键字实现,允许函数在无法处理错误时抛出异常,并由调用者处理。异常机制支持多种类型的异常抛出和捕获,且可以通过栈展开在函数调用链中匹配异常。C++还提供了异常规

2025-05-12 19:55:37 1077 1

原创 【c++】【数据结构】二叉搜索树详解

二叉搜索树(BST)是一种特殊的二叉树,具有以下性质:左子树的所有节点值小于根节点,右子树的所有节点值大于根节点,且左右子树也分别为二叉搜索树。BST的查找效率理想情况下为O(logN),但若树结构不平衡(如退化为链表),效率将降至O(N)。为解决这一问题,后续发展出AVL树和红黑树等平衡二叉搜索树。 本文还提供了二叉搜索树的C++模拟实现,包括插入、查找、删除等基本操作,并支持递归和非递归实现。代码展示了如何通过比较节点值进行搜索和插入,以及如何处理删除操作中的不同情况(如节点无子节点、有单个子节点或有两

2025-05-11 14:56:45 967

原创 【c++】多态详解

多态是面向对象编程中的一个重要概念,指的是同一操作在不同对象上产生不同的行为。在C++中,多态通过基类的指针或引用调用虚函数实现,派生类可以重写这些虚函数以提供不同的功能。多态的构成需要满足两个条件:必须通过基类的指针或引用调用虚函数,且被调用的函数必须是虚函数并经过派生类重写。虚函数通过在函数声明前加virtual关键字定义,重写要求函数名、参数列表和返回值类型完全相同。C++11引入了override和final关键字,分别用于确保函数重写正确和防止函数被重写。此外,抽象类包含纯虚函数,不能实例化对象,

2025-05-10 16:54:32 1448

原创 【c++】继承详解

说到继承,套用到生活中,我们尝常常会想到继承财产这样的场景。c++中也是如此,它允许程序员在保持原有类特性的基础上进行扩展。因为我们会遇到多个类具有部分相同的成员函数和成员变量,此时一个一个写未免有点累,此时我们将这些类中都会有的成员变量和函数定义出一个类,再创建我们想要的类,这些类继承自最开始创建的类。最开始创建的类就叫父类,之后继承父类的就叫子类,或者叫派生类。这样子类就不用再写父类中的成员了,这些成员都被继承进了子类中。

2025-05-08 18:32:35 1086

原创 【c++】模板详解

提到模板就不得不提泛型编程的概念,泛型编程即编写一段与类型无关的通用代码,使得各种类型的参数都可以复用这段代码,从而顺利偷懒,提升编程效率。

2025-05-03 23:13:37 1267

原创 【c++】【STL】priority_queue详解

priority_queue翻译过来就是优先级队列,是stl提供的一个容器适配器,也就是我们数据结构中学到的栈,是一种常用的数据结构,特点是利用类似二叉树的结构让父节点元素比子节点大,从而使对顶元素最大(小)。

2025-05-02 22:47:36 1015

原创 【c++】【STL】queue详解

queue是stl库提供的一种容器适配器,也就是我们数据结构中学到的队列,是非常常用的数据结构,特点是遵循LILO(last in last out,也就是后进后出)原则。

2025-05-01 22:32:36 659

原创 【c++】【STL】stack详解

stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO(last in first out,也就是后进先出)原则。

2025-05-01 22:17:28 762

原创 【c++】【STL】list详解

list是c++的stl库提供的链表容器,链表作为我们熟知的数据结构之一,其与顺序表相比,在任意位置插入删除方面具有绝对的优势,但在随机读取方面不如顺序表,两者属于互补关系

2025-04-30 23:07:56 1323

原创 【c++】【STL】vector详解

vector是c++提供的顺序表容器,也就是可变大小数组的序列容器。是c++中经常使用,非常方便的stl容器。

2025-04-24 20:29:14 771

原创 【c++】string类详解

string类是c++标准库中提供的类,可以方便快捷的处理字符串,得益于c++提供了面向对象的类,相较于C语言只依靠面向过程的函数而言,功能性、安全性、书写舒适度都更上一层楼。string类拥有自己的头文件,要使用时务必包含。

2025-02-21 17:21:56 884

原创 【c++】c++内存管理

realloc的扩容分为两种情况,原地扩和异地扩,因为开辟的空间要求是连续的,而堆上操作系统管理的内存并不一定就是连续的,当需要调整的空间后面有连续的空间且容纳的下扩容后的空间就直接原地扩容,以上条件不能满足时系统就会在另一边地方开辟size大小的空间,再把ptr上的数据拷贝过来完成拷贝。malloc可以在堆上开辟指定内存的空间,参数是要开辟的空间的大小(单位字节),返回开辟好的空间的指针,注意返回的是无类型指针,需要强转一下指针类型,malloc也不会对开辟好的空间进行初始化。

2025-02-17 14:01:27 1062 2

原创 【c++】类与对象详解

类是面向对象编程中对具有相同属性和行为的一组事物的抽象描述,它定义了数据成员(属性)和成员函数(行为),是创建对象的模板;而对象是类的具体实例,依据类的定义在内存中被创建,拥有类所规定的属性和行为,且每个对象的属性值可以不同,能通过调用成员函数来执行特定操作。

2025-02-02 18:44:25 1192

原创 【数据结构】排序

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2025-01-19 20:32:41 872 2

原创 【数据结构】堆与二叉树

树是一种非线性的数据结构,它是由n(n >= 0)个有限结点组成的一个具有层次关系的集合。它看起来像一个倒挂的树。二叉树最上面的结点被称为根节点,根节点没有前驱结点,也就是根结点之上没有节点。除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1

2025-01-17 22:25:33 976 2

原创 【数据结构】队列

对于队列这种数据结构,要满足其队尾插入,队头删除的特性,使用数组的话其实是不妥当的,队尾入队列还比较容易实现,队头出队列就比较麻烦了,要么在删除数据时挪动后面的所有数据,要么将队头指向下一个元素,将前面的空间浪费掉,两者一个浪费了时间,一个浪费了空间,都不好。队列的销毁可以参考链表,创建一个curr指针,再创建一个prev指针,先把curr赋值给prev,再将curr指向下一个节点,之后把prev指向的空间free掉,如此反复,链表全部销毁掉之后再把队头队尾指针置空。,进行数据删除的一端叫做。

2024-12-16 00:21:53 408 3

原创 【数据结构】栈

对于栈这种数据结构 ,我们首先要考虑的就是要怎样处理数据,考虑到其只需要满足后进先出的特性 ,笔者认为使用数组就行,使用malloc或者calloc动态开辟,再用realloc扩容就行。对于栈的信息,我们同样需要记录,栈顶的位置和栈的容量也需要用变量来记录,注意栈顶指向的是即将要插入的数,我们要获取的是栈顶之前那个,当然也可以把栈顶设为栈顶的数,压栈时栈顶注意++就行。压栈操作之前,势必要检验栈是否已满,满了就扩容,之后压栈,栈顶++。free掉动态开辟的内存,将数组指针置空,栈顶和容量归0即可。

2024-12-15 20:53:59 512 2

原创 【c语言】程序环境介绍和常用预处理指令详解

可以看到,#include"filename"的功能相比较于#include是更为强大的,当我们想要引入C语言自带的头文件时,以上的两种方式都可以,但因为#include"filename"是先在当前路径下寻找,找不到再去系统路径下寻找,如果C语言自带的头文件这种一定是会在系统路径下的头文件被#include"filename"引入,它的处理过程就是将代码中被定义的文本直接替换成指定的文本,这就是它可以被用来定义常量的原因,在预编译之后,被定义的文本就全部换成常量了。

2024-12-15 17:04:18 641

原创 【c语言】文件操作函数详解

就像顺序表或者栈等等的一些数据结构中一样,C语言的io库定义了这样的结构体来管理文件流的信息(上面有展示),也就是文件指针指向文件信息结构区,文件信息区又有位置指针指向文件流,每次文件读取完函数都会移动位置指针,读取一个字符的就推进一格,读取字符串的就推进到读取到的位置,我们无需操作就能继续对接下来的文件进行读.函数的返回值是char*类型,和第一个参数一样,在读取没有问题时,它会。,在计算机中,输入流有很多种,它代表了数据的来源,可以是键盘,网络,文件或是其他设备,到这里可能有些读者有疑问了,

2024-11-22 23:40:14 676 6

原创 【C语言】简易通讯录的制作与心得

再然后就是排序函数的实现,我打算按照人名去排序联系人,但由于我们联系人都是采用了中文输入,这里问题就来了,中文字符串是以什么样的形式在内存中的呢,这是我所不了解的,所以我做了测试,创建了一个字符数组,在输入首字母分别为ABCDEF的汉字,可以发现,在内存中,一个汉字对应了两个字节,且都是负数,而且首字母由A到F逐渐增大,所以这里我推测应该是首字母越大,内存中存储的数也越大,那就很简单了,我们直接采用冒泡排序就可以了,测试过后发现果然如此。这里我创建了一个枚举给对应的操作赋上了值,这样更加的直观。

2024-11-12 20:01:22 1712 5

原创 【c语言】字符函数与字符串函数详解与简易模拟

这里函数的实现有两种方法,对应了不同的编译器,有些编译器当前者大于后者时会固定返回-1,反之返回1,要实现这样的效果只要用if语句分3个分支就好,外面套个while循环而有些编译器返回的值除了正负确定以外其数值是不确定的,这里不难想到它其实返回了前者减去后者的值,要实现这样的效果更简单,if两个分支,一个返回0,一个返回差值就行。如果长度大于num,复制到指定长度之后还会添加\0的。destination为要追加的字符串的位置,source为追加的字符串的位置,返回的是追加完的字符串的位置。

2024-11-10 00:18:31 1824 4

原创 【C语言】简易扫雷程序的制作与心得

这里我就简单补充一下,game.h被我拿来做了三件事,声明函数,声明库,定义符号常量。这之后是库,由于我们运用了很多库函数,所以需要声明调用各种库,但我们创建了很多个源文件,一个一个声明未免麻烦,我们直接在头文件中声明完,之后就都只要声明调用这个头文件即可,然后就是字符常量的声明,#define_CRT_SECURE_NO_WARNINGS 1不用说了,防止scanf函数报错,之后的字符常量就是数组的尺寸和雷的数量这其实是扫雷难度本质区别的数字,如果我们想改难度,就改这三个字符常量就行。

2024-10-24 19:05:50 1560

原创 【c语言】分支与循环语句的简要介绍

for循环就像是一个训练计划,先设定好目标(初始化),然后不断重复训练(执行代码块),直到达到某个标准(条件不再满足),最后更新自己的状态(更新表达式),准备下一次的训练。程序会依次检查每个条件,一旦找到满足的条件,就执行对应的代码块,然后跳出整个结构。do-while循环:与while循环类似,但不同的是,do-while循环至少会执行一次代码块,然后再检查条件是否满足。if语句:如果某个条件为真(true),则执行一段代码。分支语句,顾名思义,就是根据条件的不同,让程序执行不同的路径,达到想要的目的。

2024-07-26 18:49:59 358 1

空空如也

空空如也

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

TA关注的人

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