- 博客(61)
- 收藏
- 关注
原创 【Linux从入门到放弃】进程间通信——匿名管道和命名管道
进程间通信之管道是一种在进程之间传输或交换信息的机制,它允许在两个或多个进程之间建立一条数据流,从而实现资源共享和数据传输。进程间通信(IPC)的基本概念类似于现实生活中人与人之间的交流,旨在通过特定的方式解决信息传递的问题。在操作系统中,每个进程通常拥有独立的地址空间,它们之间相互隔离,就像彼此不可见的个体。然而,在实际的应用场景中,进程之间往往需要一种方式来共享数据或者通知某个事件,这就需要用到进程间通信机制管道是Unix中最古老的进程间通信的形式,它本质也是文件。
2024-07-23 10:10:40
733
1
原创 【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果
之前的几篇博客已经是对进程的相关概念做了详细了解,现阶段对进程的定义为内核数据结构加上该进程对应的代码和数据,操作系统对进程通过先描述再组织的方式做管理。有了这些预备知识,接下来就是要学习如何控制进程,也就是在操作上该怎么做。通过系统调用,获取子进程退出码或者退出信号的方式,同时释放内存问题。总结:本文深入探讨了操作系统中进程管理的三个核心方面:进程的创建、退出和等待。首先,我们了解了进程创建的过程,它涉及到操作系统如何为新进程分配必要的资源,包括内存空间和处理器时间,并初始化进程表以跟踪和管理进程状态。
2024-07-02 21:26:19
712
原创 【Linux从入门到放弃】进程地址空间
在之前的学习当中,我们肯定关于数据的存储有一定的了解,比如全局变量应该存储在什么位置,动态申请的空间又在什么位置等等。此篇博客就关于在Linux环境中对地址空间作以详细讲解。下图我们之前学习C语言应该了解的空间布局图,那么有一个问题:这块空间是不是我们所说的内存呢?带着这个问题进入到此篇博客中。先讲个小故事,从前有一个大富豪,可谓是富甲一方,假设说有RMB十个亿,一个人有了钱就容易花天酒地,于是就有了好几个私生子,但是这个孩子都是生活在不同的地方,彼此并不知道对方的存在。
2024-06-20 20:53:10
913
原创 【Linux从入门到放弃】Linux操作系统环境变量一文详解
提到环境变量,大家应该都不会陌生,不管学习Java还是Phython都需要去安装环境变量,尤其是我自己在做深度学习时配置环境变量简直了,那叫一个惨,真的是莫名其妙不知道是哪里出的错,总之就是很难!那么今天的目的就是解释一下什么是环境变量。环境变量本质就是一张内存级的一张表,这张表由用户在登陆系统的时候,进行给特定用户形成属于自己的环境变量表。环境变量中的每一个都有自己的用途:有的是进行身份认证的,有的是进行确认当前路径的,有的是进行路径查找的,而有的是进行动态查找的等等。
2023-11-18 20:47:17
1090
25
原创 【Linux从入门到放弃】进程状态的理解以及什么是僵尸进程和孤儿进程?
此篇博客依然是在之前的学习基础之上继续探究关于进程的知识。从名字其实就可以感受到,孤儿就是了没有了父母,也就是父进程先退出,而子进程没有了父进程获取它的退出结果,那么子进程就变成了孤儿进程。之所以父进程正常退出没有变成僵尸状态那是因为父进程的父进程是bash父进程退出的时候bash获取到了父进程的退出结果。此篇博客首先就是关于进程的几种状态做了解释,主要就是对阻塞和挂起的理解。再者就是明对僵尸状态和僵尸进程的理解,如果子进程先退出而父进程又一直不获取子进程的退出结果,那么子进程就变成了僵尸进程。
2023-07-10 16:59:40
1088
36
原创 【Linux从入门到放弃】进程概念、查看进程、创建进程
那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!我们之前任何启动并运行程序的行为,都是操作系统帮助我们将程序转化为进程,完成特定的功能。
2023-07-03 17:23:20
852
33
原创 【Linux从入门到放弃】冯诺依曼体系机构、操作系统及管理的本质
在学习linux的过程中,有一个特别重要的知识点就是关于进程的学习,那么在学习进程之前,首先对硬件做一些了解,然后再学习软件,在软硬件都学完之后再取去了解进程的概念。以上就是在学习进程之前该了解的一些知识,主要明白操作系统管理的本质,而这个本质也是始终贯穿于Linux的整个学习。
2023-06-29 17:59:19
1257
45
原创 【C++从入门到放弃】模板进阶——非类型模板参数、类模板的特化、模板的分离编译
之前我已经写过一篇关于模板的博客,在之前那篇文章的基础之上再对模板进行补充。链接:模板初阶通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现了一个专门用来进行日期大小比较的函数模板。// 函数模板 -- 参数匹配 template < class T > bool Greater(T left , T right) {// 可以比较,结果正确 Date d1(2023 , 6 , 20);
2023-06-25 15:15:24
476
17
原创 【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍
此篇博客将谈及到的stack、queue和priority_queue都不是STL的标准容器,而是一种空间适配器。它是通过对一种容器进行封装,并且所有的方法全部由底层依赖的容器进行实现。stack是一种容器适配器,专门设计用于后进先出的上下文环境中,在这种环境中,元素只从容器的一端进行插入和提取操作。stack是作为容器适配器实现的,容器适配器即是对特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的尾部(即堆栈的顶部)被压入/弹出。
2023-06-19 17:16:54
617
21
原创 【C++从入门到放弃】list深度剖析及模拟实现
list 是允许在序列内的任何位置进行常量时间的插入和删除操作的序列容器,并且该容器可以前后双向迭代。list 的底层为双链表结构,双链表可以将它们包含的每个元素存储在不同且不相关的存储位置,在节点中通过指针指向其前一个元素和后一个元素。list 与 forward_list 非常相似:主要区别在于 forward_list 是单链表,因此它们只能向前迭代,以让其更简单和更高效。与其他基本标准序列容器(array、vector和deque)相比,list 在容器内的任何位置插入、获取和移动元素。
2023-06-12 20:26:18
1448
32
原创 【C++从入门到放弃】vector深度剖析及模拟实现
vector 是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2023-05-26 18:08:55
1312
29
原创 【C++从入门到放弃】string全方面分析(常用接口、模拟实现)
在学习C++的过程中,必定有一个非常重要的工具就是STL(标准模板库):C++标准库的重要组成部分,它不仅是一个可复用的组件库,而且还是一个包罗数据结构与算法的软件框架。接下来我会将STL中几个主要的容器进行总结。string类文档介绍字符串是表示字符序列的对象。标准string类通过类似于标准字节容器的接口为此类对象提供支持,但添加了专门用于操作单字节字符字符串的特性。
2023-04-09 18:58:10
803
33
原创 【C++从入门到放弃】模板介绍(函数模板、类模板)
函数模板代表了一个函数聚合体,该函数模板与参数类型无关,在函数调用的时候根据传参的类型将函数模板里的参数进行参数化,也就是根据实参类型产生函数的特定类型版本。template < class T1 , class T2 , . . . , class Tn > class 类模板名 {// 类内成员定义 };
2023-04-02 20:14:55
846
34
原创 【C++从入门到放弃】C/C++内存管理(new和delete的用法详解)
在学习C/C++内存管理之前,我们先看一下下面的代码与相关问题。free(ptr1);free(ptr3);选择题:选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里?____staticVar在哪里?____ localVar在哪里?____num1 在哪里?____char2在哪里?____ *char2在哪里?___pChar3在哪里?
2023-03-29 23:12:45
995
30
原创 【C++从入门到放弃】类和对象(下)——(再识构造函数、static成员、友元、内部类、匿名对象、拷贝对象时的编译器优化)
此篇文章是在之前的基础上再对类和对象做一些补充在类和对象阶段,我们一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有哪些属性,哪些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。
2023-03-22 20:55:38
580
40
原创 【C++从入门到放弃】类和对象(中)———类的六大默认成员函数
在上一篇文章中提到过空类的存在,它的大小为一个字节,目的就是为了标识这个类的存在。但是空类中真的什么都没有吗?当然不是的,任何类在什么都不写时,编译器会自动生成以下六个默认成员函数。而这六个默认成员函数只会在用户没有显式定义的情况下被编译器自动生成,如若用户自己显示定义了这几个函数,那么编译器不会自动生成默认的成员函数。编译器自动生成的函数称为默认成员函数。以上就是对类的六大默认成员函数的简单介绍,掌握了这些知识,对后面的C++学习会有很大的步骤,我也相信自己会一步一步往前走,更上一层楼!
2023-03-03 21:28:45
576
27
原创 【C++从入门到放弃】类和对象(上)
在学习类和对象之前,我们要对面向过程和面向对象有一个初步的了解:C语言是面向过程的,面向过程所关注的是分析出解决问题的步骤,通过函数调用逐步解决问题;C++是面向对象的,面向对象是把构成问题事务分解成多个不同的对象,靠对象之间的交互完成,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。// 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{}中为类的主体,注意类定义结束时后面分号不能省略。
2023-02-26 22:10:28
712
37
原创 【C++从入门到放弃】初识C++(基础知识入门详解)
C++是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。定义命名空间,需要使用到namespace关键字,后面再跟上。
2023-02-13 18:10:29
1303
33
原创 【Linux从入门到放弃】Linux编辑器——vim的使用
当我们学习 Linux 开始编程时,就需要一个开发工具,对于刚开始学习 Linux 的我们最适合使用 vim 编辑器。vim 文本编辑器,是由 vi 发展演变过来的文本编辑器,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。比如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x windows、mac os 、windows。
2023-01-07 20:09:44
1816
39
原创 【数据结构】八大排序算法详解
在日常生活中,我们经常需要对收集到的各种数据进行处理,这些数据处理中用到的核心运算就是排序。例如,手机App中的各种排行榜,每年都会有的全国高校排行榜等等,它们都是按照一定的规律来进行排序的。目前已有上百种排序算法,此篇博客将介绍几类经典而又常用的排序算法,包括基本的算法思想、实现代码及性能分析。所谓排序,就是将待排序文件中的记录按照其中的某个或某些关键字的大小,递增或递减的排列起来,即将一组无序的记录序列调整为有序的记录序列。
2022-12-15 17:56:09
2747
52
原创 【Linux从入门到放弃】Linux权限详解(用户权限、文件权限、权限设置)
生活当中处处存在着有关权限的案例,比如:在腾讯视频、爱奇艺视频这样的视频软件上面总会有许多的VIP电视剧或者电影,只有你充值了对应的会员才可以观看;王者荣耀上有着许多好看的皮肤,但是只有你花钱购买了它才可以穿在你对应的英雄身上。这种就可以认为权限是限制人的行为的。 除此之外,你去西餐厅给人家服务员说给我上一道麻婆豆腐;你在五金店给人家老板说给你装上三斤橘子;你要在腾讯视频里敲代码。很明显这些都是不可能的,而这也是一种权限,这种权限代表的是你所访问的对象根本没有这种“属性”。 总的来说,权限 =
2022-12-06 18:14:19
1843
48
原创 【数据结构】二叉树详解(下篇)
上一篇文章主要讲解了关于二叉树的概念、性质以及顺序结构的实现,此篇文章将继续完成堆的应用、二叉树的链式结构介绍以及相关操作实现。至此就基本完成了对二叉树的学习,主要还是要明白二叉树的性质,堆的创建、排序和TOPK问题,核心内容就是要明白向下调整算法以及向上调整算法的实现(这些都是建立于二叉树是完全二叉树的基础之上)。再者就是熟悉二叉树的遍历算法,主要是前中后序遍历,层序遍历的实现稍微有点难度,以及二叉树的有关操作(递归实现)。
2022-11-30 21:42:33
1070
44
原创 【Linux从入门到放弃】Linux基本指令大全
语法: 功能:显示当前目录下的文件列表(普通文本文件、目录等等) 常用选项:当然以上指令的选项都可和在一起使用,选项的先后顺序没有差别。 功能:显示用户当前所在的目录当你使用该指令所打印出来的信息就表示当前用户现在所处的路径。 语法: 功能:改变工作目录。将当前工作目录改变到指定的目录下 语法: 功能: 创建一个名叫 test.txt 的空文件(在当前目录下) 语法: 功能:在当前目录下创建一个名为 “dirname”的目录 rmdir 是一个与 mkdir 相对应的
2022-11-27 19:09:27
7900
61
原创 【数据结构】二叉树详解(上篇)
本文将主要对树、二叉树的相关概念和性质展开讲解,同时用代码实现一种特殊的二叉树(堆)的顺序存储实现。树是一种非线性的数据结构,它是由 n(n >= 0)个有限结点组成一个具有层次关系的集合。当 n = 0 时,称为空树。① 有且仅有一个特殊的点称为根结点,根结点没有前驱结点;② 当 n > 1 时,其余结点可分为 m(m > 0)个互不相交的有限集 T1、T2、……、Tm,其中每个集合本身又是一棵树,并且称为根的子树。
2022-11-23 22:19:29
1060
48
原创 【牛客网】链表中倒数第k个结点、CM11 链表分割、OR36 链表的回文结构
输入一个链表,输出该链表中倒数第k个结点。 对于这道题,同样通过快慢指针的思想去解决,但是这个快指针不是每次向后移动两步,而是先让快指针走上步,然后快慢指针再同时移动,当快指针指向空的时候慢指针指向的结点刚好为所要找的结点。除此之外,还要考虑到一些特殊情况,比如只有三个结点,却要返回倒数第四个结点;或者返回倒数第零个结点。二、链表分割 现有一链表的头指针 ,给一定值 ,编写一段代码将所有小于 的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 对于这道题,有两种解
2022-11-19 21:45:51
1190
48
原创 【数据结构】我家三岁表弟都明白的栈和队列,你不会不了解吧?
以上为对栈和队列的介绍,一定要注意最开始对其的初始化条件:比如栈的top指针到底指向哪里非常关键。相对来说栈与队列理解起来也比较轻松,主要是明白它们各自的属性特征。文章若有不足的地方还请大佬指正!!!
2022-11-14 22:55:59
1208
56
原创 【LeetCode】移除链表元素、反转链表、链表的中间节点
给你一个链表的头节点 和一个整数 ,请你删除链表中所有满足 的节点,并返回 新的头节点 。 对于这道题,定义一个当前指针从第一个结点开始比对,那么就会有两种情况:第一种情况为当前结点不是要移除的结点,则将当前指针向后移动进行下一个结点的比对;第二种情况就是当前结点是要移除的结点,对于这种情况还要分为两种,一种就是该结点为链表的第一个结点,只需将链表头指针和当前指针同时向后移动即可,另一种就是为链表中结点,则需要让被移除结点的前驱结点指向它的后继结点,由于此链表为单链表,当你找到链表中要被删除结点
2022-11-11 16:17:27
568
40
原创 【数据结构】原来你叫“带头结点的双向循环链表”啊
上篇博客带大家认识了单链表,单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次向后遍历。对于插入、删除操作得从头遍历,尤其是在链表尾部,还有一点就是无法一步的访问到某个节点的前驱节点,也就是说访问前驱节点的时间复杂度为O(n)。为了避免这样的缺点,便引出了双向循环链表首先,它是一个链表,通过指针将所有的结点连接在一起;其次,循环链表表示整个链表从头到尾构成一个环,链表尾结点的next指针指向头结点;再者,双向表示链表结点有两个指针prev和next,分别指向其前驱结点和后继节点;
2022-11-08 19:06:51
2163
64
原创 【数据结构】单链表——单链表的定义及基本操作的实现(头插、尾插、头删、尾删、任意位置的插入与删除)
顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式表示,但是插入和删除操作需要移动大量元素。链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过“链”建立起数据元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需要修改指针,但也会失去顺序表可随机存取的优点。线性表的链式存储又称为单链表,它是通过一组任意的存储单元来存储线性表表中的数据元素。
2022-11-04 20:46:29
1629
65
原创 【LeetCode】移除元素、删除有序数组中的重复项、合并两个有序数组
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。提示:首先要明白的是,该题目给定一个数组,删除题目给定的数组中存在的数字,并将删除后的数组元素个数进行返回,还有就是将非删除的元素进行往前挪动,因为改题目在自测时会根据你返回的数组元素个数进行访问,并不会去管数组后面的几个数字是多少。对于该题目,我们可以通过循
2022-11-01 10:46:35
1550
56
原创 【数据结构】线性表之顺序表详解
数据的逻辑结构分为线性结构和非线性结构,线性结构中的线性表根据存储结构又分为顺序表和链表。这篇博客主要讲的是顺序表的定义和基本操作,以及它是如何实现的。线性表是具有相同数据类型的n (n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2022-10-28 20:50:18
1793
42
原创 【数据结构】什么是时间复杂度、空间复杂度?看此篇文章足矣
在数据结构中,有着众多的算法,比如查找算法,排序算法等。在查找算法中有顺序查找、折半查找、分块查找等,排序算法中有冒泡排序、快速排序、希尔排序等,而面对这么多的算法,是怎样去衡量算法的执行效率呢?而这也就是此篇文章的重点:时间复杂度和空间复杂度。
2022-10-24 15:16:09
4341
54
原创 【数据结构】什么是数据结构?
此篇文章旨在对数据结构做一个初步认识,了解数据结构相关的概念和术语以及它的三要素。以上为学习数据结构的基础知识,也不是说非得熟知这些知识,只要你对于这些有一定的了解,那么对于后续的数据结构知识学习有一定的帮助。
2022-10-23 17:52:46
2610
43
原创 【C语言】让你不再因为指针而感到头疼
想必对于很多刚接触C语言的同学来说关于指针的知识点很头疼,就感觉跟树枝一样错综复杂,最终搞得自己不知道指针该指向哪里,此片文章就对指针做一个详细介绍,希望能够帮到你!在计算机科学中,指针是编程语言中的一个对象。指针是内存地址,指针变量是用来存放内存地址的变量,利用内存地址可以直接指向存在电脑存储器中的那块内存单元,从而能找到所需的变量单元,也就是说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。//在内存中开辟一块空间 int * p = & a;
2022-10-18 17:24:10
1161
39
原创 【牛客网】数组中值出现了一次的数字
接下来就将所有的数字左移 x 位进行判断是否为 1 而被分组,最后将这两个组的数据分别进行异或各自得到的数字就为那两个出现奇数词的数字。输入包含两行,第一行一个整数n(1≤n≤10^5),代表数组arr的长度,第二行n个整数,代表数组arr,arr[i]为32位整数。将所有的数字进行异或,得到的数字二进制的某一位(假设第 x 位)肯定为 1 ,而这个 1 就可以作为分组的标准。,对于这道题,可以将所有的数字分成两组,而两个出现奇数词的数字刚好会被分在不同的组内,输出出现奇数次的两个数,按照从小到大的顺序。
2022-10-16 17:16:50
789
16
转载 【C语言】自定义类型(结构体,位段,枚举,联合)
int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2 //初始化:定义变量的同时赋初值。x , y };struct Stu //类型声明 {//名字 int age;//年龄 };//初始化 struct Node {int data;
2022-10-16 11:31:13
199
6
原创 【C语言】atoi函数模拟实现
基本上该函数的模拟实现要注意的细节都在上面的代码注释里。还要再解释的是为什么要将返回值定义成 long long 长整型,而不是stoi函数的返回值 int 型呢?这是因为在计算求和的时候万一出现越界,由于之前将返回值定义为 int 型,这时就会将已经越界的数字强制转换为非越界的数字,那么就会导致错误的输出结果和错误的合法性判断。
2022-10-15 18:27:22
905
39
原创 【C语言】通讯录管理系统(文件版本)
之前写过两个版本的通讯录管理系统,存在一个缺陷就是所有的用户信息的临时的,当关掉程序后所有的用户信息都会丢失掉,为了使用户信息一直保存在文件当中,可以使用相关的文件操作的动态管理系统进行改进。
2022-10-12 16:41:19
1888
30
原创 【C语言】文件操作(超详细讲解)
计算机文件,属于文件的一种,与普通文件载体不同,这类文件是以硬盘为载体存储在计算机上的信息集合。在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。此片文章内容是针对于数据文件。
2022-10-11 23:09:51
1136
26
原创 【C语言】函数栈帧的创建与销毁
随着不断地学习C语言,相信每个人都可能存在着一些疑惑?1.局部变量是怎么创建的?2.为什么局部变量的值是随机值?3.函数是怎样传参的?传参的顺序是怎样的?4.形参与实参是什么关系?5.函数调用是怎样做的?6.函数调用结束后怎样返回的?这篇文章所使用的环境是VS2013,在不同的编译器下,函数调用过程中栈帧的创建与销毁是有所不同的,具体细节取决于编译器的实现,当然大体逻辑结构都是类似的。
2022-10-05 12:05:05
1188
28
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人