自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

2023-12-23 19:36:53 835

原创 进程间通信——管道

数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”

2023-11-20 19:42:50 77

原创 Linux下动态库和静态库

方法3:修改系统配置文件,系统存在一个动态库默认搜索的配置文件:/etc/ld.so.conf.d/,在该路径下创建一个文件后缀必须是.conf,将我们要使用的动态库路径写到创建的这个文件内,完成后执行 ldconfig,更新一下。当同一个目录下有同名的一个静态库和一个动态库,默认使用动态库,所以-static的意义就是,摒弃优先使用动态库的原则,直接使用静态库。倒环境变量:绝对路径后面不用再指明库的名字了,因为链接的时候,可执行程序已经知道了自己要使用哪一个库。方法1:将动态库拷贝到系统库路径下。

2023-11-16 22:46:28 80

原创 理解文件系统与inode

进程中讨论的都是被打开的文件,那在磁盘中有大量的没有被打开的文件,需要系统进行管理。

2023-11-15 20:37:59 64

原创 基础IO的理解

fread函数:函数有四个参数:第一个参数是一个指向存储读取到的数据的缓冲区的指针,第二个参数是需要读取的每个数据字节的大小,第三个参数是要读取的数据的总字节数,第四个参数是要读取的文件的文件句柄。注意:最后才调用的fork,之前的函数已经被执行完了,但是并不代表数据以及刷新了(数据还在C标准库定义的缓冲区中),因为进程还没有退出,并且是向文件中写入(全缓冲),所以在父子进程退出时,才将缓冲区中所有的数据刷新到文件中。进程的工作路径,每一个进程都有描述该进程信息的文件,在 /proc/进程id 路径下。

2023-11-15 15:49:54 29

原创 简易版的shell实现

【代码】简易版的shell实现。

2023-11-12 14:49:14 24

原创 Linux进程控制

理论上,子进程也要有自己的代码和数据,但一般而言,没有这个加载的过程(将磁盘中的代码和数据加载到内存),也就是说子进程没有自己的代码和数据,所以子进程只能“使用”父进程的代码和数据。main函数的返回值是进程退出码,表示进程是否正确返回,非0:标识运行结果不正确,非0值有无数个,不同的非0值就可以标识不同的错误原因,从而给程序在运行结束之后,结果不正确时,方便定位错误的原因细节。通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

2023-11-12 14:37:06 24

原创 进程地址空间

我们发现,输出出来的变量值和地址是一模一样的,很好理解,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。怎么可能,同一个地址,同时读取的时候,出现了不同的值。这里的地址,绝对不是物理内存的地址,而是虚拟地址。所以几乎所有的语言,如果有“地址”的概念,这个地址一定不是物理地址,而是虚拟地址。所以之前说“程序的地址空间”是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址。

2023-11-08 14:24:39 37

原创 Linux进程基础

计算机管理硬件1. 描述起来,用struct结构体2. 组织起来,用链表或其他高效的数据结构。

2023-11-06 22:34:05 25

原创 冯诺依曼体系结构

输入设备、输出设备与CPU直接交互,因为这些外部设备的传输速度相较于CPU太慢了,根据木桶原理,严重影响了整个体系的效率,所以就不让输入输出设备与CPU直接交互了,而是在它们中间加入了存储器(内存),内存的效率要大于输入输出设备,但是有小于CPU,就能够在整个体系中起到一个缓冲的作用。所以当CPU需要获取某一行数据时,内存可以将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据。,需要CPU从存储器取出指令和数据进行相应的计算。

2023-10-30 19:36:40 88

原创 Linux调试器-gdb使用

Linux gcc/g++出来的二进制程序,默认是release模式。程序的发布方式有两种,debug模式和release模式。

2023-10-30 18:34:09 24

原创 Linux项目自动化构建工具-make/Makefile

源文件一定是比可执行文件的时间要早,所以Makefile在编译时检测所有源文件和可执行文件的时间如果可执行程序是所有文件中最晚的,那这个可执行文件就是最新的。Makefile会根据可执行文件的最近修改时间来判断是否是最新的,从而判断要不要执行make。make是如何工作的,在默认的方式下,也就是我们只输入make命令。

2023-10-29 23:28:37 22

原创 Linux编辑器-gcc/g++的使用

gcc [选项] 要编译的文件 [选项] [目标文件]-static 此选项对生成的文件采用静态链接。

2023-10-29 22:33:16 20

原创 Linux编辑器—vim的使用

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。

2023-10-29 16:14:01 44

原创 Linux权限理解

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-10-29 15:38:02 36 1

原创 Linux基本指令

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2023-10-28 23:18:42 27

原创 C++模板

class 类模板名// 类内成员定义public://{// {// }//}_top = 0;--_top;private:// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if (_a)_a = tmp;一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

2023-09-25 22:00:58 84 1

原创 C/C++内存管理

/ 申请单个Test类型的空间free(p1);// 申请10个Test类型的空间free(p2);// 申请单个Test类型的对象delete p1;// 申请10个Test类型的对象int main()Test1();Test2();return 0;

2023-09-25 12:19:45 62 1

原创 类与对象(下)

/ 设计一个只能在栈上定义对象的类public:return so;int _y = 0;int main()// 栈// 静态区return 0;

2023-09-24 11:32:28 68 1

原创 类与对象(中)

那么编译器生成的默认赋值重载函数已经可以完成字节序的值拷贝了,我们还需要自己实现吗?当然像日期类这样的类是没必要的。有需要开辟空间的类成员就需要自己利用深拷贝实现赋值重载函数。编译器自动生成的只是浅拷贝,程序会崩溃。

2023-09-23 21:50:54 35 1

原创 类与对象(上)

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。int age;

2023-09-21 19:54:21 22

原创 C++入门

C++入门基础知识总结归纳

2022-08-14 16:29:29 87 1

原创 堆排序及TOP-K问题

一、堆排序方法一:新建一个堆,将数组a中数据依次插入到新建的堆中,再循环取堆顶元素放到原数组a中,每取一个堆顶元素之后就删除该堆顶元素;升序就建大堆,降序就将小堆时间复杂度:O(N*logN) 空间复杂度:O(N)void HeapSort(int* a, int size){ HP hp; HeapInit(&hp); for (int i = 0; i < size; i++) { HeapPush(&hp, a[i]); } int j =

2022-04-13 21:55:03 301

原创 数据结构—堆的C语言实现

因为堆在逻辑上是一个完全二叉树,所以首先需要先了解树的概念,再理解二叉树以及完全二叉树一、树1.树的概念及结构:a.树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。b.有一个特殊的结点,称为根结点,根节点没有前驱结点。c.除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结.

2022-04-11 20:27:58 1043 2

原创 数据结构—队列与栈的相互实现以及相互比较

目录一、队列实现栈二、用栈实现队列三、队列与栈的相互比较一、队列实现栈LeetCode题目链接:用队列实现栈题目描述:声明:下面再用队列实现栈的过程中,使用的实现队列功能的函数,在之前的文章中有详细记录文章链接:数据结构—队列的C语言实现1、定义用队列实现栈的结构体typedef struct { Queue q1; Queue q2;} MyStack;2、创建栈动态开辟一个用队列实现栈的结构体空间,然后再调用队列的初始化函数,.

2022-04-09 22:52:33 1265

原创 数据结构—设计循环队列C语言实现

LeetCode题目链接:设计循环队列题目描述:思路:1、因为队列是循环的,所以可以用循环链表实现,让链表尾指向链表头即可,但是会有一个问题就是,插入数据的时候,尾插找队列尾的时候不方便,记录队列尾的指针永远指向的都是队列尾的下一个位置(下面会说原因),就需要用循环来找尾2、可以用数组来实现,数组在内存中是连续的空间,可以直接用两个数组的下标来控制队列的实现,数组实现的弊端就是在循环的时候数组边界需要特殊考虑,但是可以多加个判断条件来判断边界条件即可,相对于用链表实现更优,所以循环.

2022-04-09 17:40:28 2094

原创 数据结构—队列的C语言实现

一、队列的概念及结构1.队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头2.队列的实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。二、结构体定义链式结构:表示队列typedef int QDataType;typedef struct

2022-03-28 23:22:49 1443

原创 数据结构—栈的C语言实现

一、栈的概念及结构1.栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插...

2022-03-27 20:15:36 1581

原创 数据结构—带头双向循环链表C语言实现

目录一.链表结构二.定义结构体三.动态开辟新节点并初始化四.初始化哨兵位的头节点五.双向链表打印六.双向链表尾插七.双向链表尾删八.双向链表头插九.双向链表头删十.双向链表查找十一.双向链表在pos的前面进行插入十二.双向链表删除pos位置的节点十三.双向链表销毁一.链表结构带有哨兵位头节点phead,可以通过phead找到链表第一个节点和最后一个节点,每一个节点除了能找到它下一个节点,还能找到上一个节点二.定义结构体t.

2022-03-25 18:55:17 690

原创 Leetcood—复制带随机指针的链表

题目链接:复制带随机指针的链表描述:若要实现一个链表的复制那就很方便,但本题给每个节点增加了一个额外的随机指针random,该指针可以指向链表中的任何节点或空节点,意思就是,原链表中每一个节点的random都确定的指向了原链表中的任何节点或者空节点,而拷贝之后的链表中每一个节点的random也要对应于原链表指向拷贝链表中相同位置的节点,如上图:原链表第二个节点中的random指向了第一个节点的位置,所以拷贝之后的链表的第二个节点也要指向拷贝链表的第一个节点关键就在于如何处理拷贝链表中每一

2022-03-25 16:22:30 1011

原创 数据结构—单链表C语言刷题2

1.链表分割题目链接:链表分割题目描述:现有一链表的头指针 ListNode*pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。思路: 另外定义两个链表,遍历原链表的每一个节点,将节点中存储数据比x小的节点尾插到链表1后,将节点中存储的数据比大于等于x的节点尾插到链表2后,循环完后再将链表2的头尾插到链表1,这样就将两个链表链接为一个新的链表,最后返回链表1的头节点实现:另外开辟两个哨兵位的头节点,链表1的头节..

2022-03-24 22:58:43 1912

原创 数据结构—单链表C语言刷题1

1.移除链表元素题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/description/分别定义两个结构体类型指针cur和prev,cur用来遍历链表,prev用来保存cur所在位置的上一个节点的地址,如果cur所在节点的元素不等于所要删除的值,则prev先保存cur所指向节点的地址,再将cur向后走,这样就保证了cur每走到一个节点都能通过prev找到它上一个节点的位置,便于删除元素后的节点之间的链接。找到所.

2022-03-21 20:12:48 1215

原创 数据结构—单链表C语言实现

目录一、链表的概念与结构二、定义结构体三、打印单链表四、增加链表结构五、尾插六、尾删七、头插八、头删九、查找指定数据十、在pos位置之前插入十一、在pos位置之后插入十二、删除pos位置数据十三、删除pos之后一个位置数据十四、销毁动态开辟的空间总结一、链表的概念与结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。结构:二、定义结构体typedef .

2022-03-19 21:31:19 1227

原创 数据结构—顺序表C语言实现

目录一、定义一个结构体二、初始化顺序表三、销毁动态开辟的空间四、检查容量并且扩容五、打印顺序表六、尾插七、尾删八、头插九、头删十、在指定位置插入一个数十一、删除指定位置处的数十二、数据的查找十三、调试 结果一、定义一个结构体//顺序表的动态存储typedef struct SeqList{ SLDataType* a; //指向之后动态开辟的数组 int size; //存储的有效数据的个数 int capa.

2022-03-18 22:37:19 1059

空空如也

空空如也

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

TA关注的人

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