- 博客(84)
- 收藏
- 关注
原创 【Linux】C文件系统详解(四)——磁盘的物理和抽象结构
正确的做法:什么都不要干,使用某种软件找到这个文件的inode编号,首先在分组中对应的inodebitmap对应位置置为1,再查找inode表对应的数据块bitmap置为1,然后查找数据块,就能恢复出来了。举个例子,一个分区内,有100个分组,每个分组有100个inode编号,当inode是250号的时候,我们就能推算出他是在第三组的。一个文件的内容是变化的,我们是用数据块来进行文件内容的保存的,所以一个有效文件,要保存内容,就需要[1,n]个数据块。
2023-11-20 10:15:54
236
原创 【Linux】C文件系统详解(三)——如何理解缓冲区以及自主封装一个文件接口
所以真正的调用顺序应该是:在fork之前,write就直接打印进文件了,但是fwrite只是写在缓冲区中.在fork之后,fwrite的缓冲区中的文件变成了两份(写时拷贝),由此,会出现打印两次的现象.(下图中有解释)在你进行fopen打开文件的时候,会得到一个FILE结构体,缓冲区就在该结构体中。以前写过一个进度条, 有一个输出缓冲区->这个缓冲区在哪里,为什么要存在。而调用write时,是系统调用,没有缓冲区,会直接刷新出来。1.历史上我们所谈的缓冲区指的是:用户级缓冲区,语言提供。
2023-11-19 12:00:00
274
原创 【Linux】C文件系统详解(二)——什么是fd文件描述符以及理解“一切皆文件“
进行操作系统的访问,在进程的角度,只能看到文件对象,而看不到底层的设备的区别,所以我们才说"Linux下一切皆文件".在上层无法感知的情况下,在OS内部,更改进程对应的文件描述符表中,特定下标的指向!所以stdout cout->1,他们都是向1号文件描述符对应的文件打印。stderr cerr ->2 ,他们都是向2号文件描述符对应的文件打印。任何一个进程,在启动的时候,默认会打开当前进程的三个文件。把fd为3的文件关闭以后,新的文件fd应该是什么。最小的,没有被使用的数组元素,分配给新文件。
2023-11-18 12:00:00
791
原创 【Linux】C文件系统详解(一)——C文件操作
1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件2.文件系统3.动静态库 – a.制作者的角度 b.站在使用者的角度 c.如何理解动态库加载(进程地址空间的内容)
2023-11-17 16:59:32
395
原创 【Linux】进程程序替换
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用成功时则不返回,因为此时已经替换了,后续的代码已经没有意义了,没有必要返回值了.(成功了就和接下来的代码无关了)带p字符的函数,不用告诉我程序的路径,你只要告诉我程序的名字,我会自动在环境变量PATH中进行可执行程序的查找.将指定的程序加载到内存中,让制定进程进行执行。
2023-11-08 10:33:13
100
原创 【Linux】进程等待
(通过kill -l进行对应数字的查看(比如发生段错误,除0操作等)),此时退出码是否为0或者是其他的,都无意义,我们不讨论它.2.张三->李四,本质是状态检测,如果没有就绪,直接返回->每一次都是一次非阻塞等待->多次非阻塞等待我们称为:轮询。2.wait/waitpid是一个系统调用->OS->OS有资格也有能力去读取子进程的task_struct。wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。
2023-11-03 11:30:00
77
原创 【Linux】进程地址空间
如果让进程之间访问物理内存,进程可能越界非法操作,非常不安全地址空间的存在,可以更方便的进行进程和进程的数据代码的解耦,保证了进程独立性这样的特征让进程以统一的视角,来看待进程对应的代码和数据各个区域,方便使用编译器也以统一的视角来编译代码(规则是一样的,编完以后即可直接使用)
2023-11-02 11:30:00
58
原创 【Linux】进程创建
当一个进程调用fork之后,就有两个二进制代码相同的进程。所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。
2023-11-02 11:30:00
55
原创 【Linux】环境变量
bash就是一个系统进程,mycmd也会变成一个进程,是bash的子进程->环境变量具有全局属性是因为会被子进程继承下去->为什么呢:为了不同的应用场景–让bash帮我们找指令路径,身份认证。环境变量中的每一个,都有自己的用途:有的是进行路径查找的,有的是进行身份认证的,有的是进行动态库查找的,有的是用来进行确认当前路径的等等->每一个环境变量都有自己的特定应用场景。)的表,这张表由用户在登陆系统时,进行给特定用户形成属于自己的环境变量表。.和source是一样的,就是让后面跟着的环境变量立马生效。
2023-11-01 11:30:00
63
原创 【Linux】进程状态与进程优先级及其相关概念
>阻塞一定是在等待某种资源->为什么要阻塞:进程要通过等待的方式,等具体的资源(磁盘\网卡\显卡等各种外设)被别人使用完之后,再被自己使用.挂起:全程阻塞挂起.当操作系统的内存不足时,操作系统会把正在被阻塞中的进程,包括它的代码和数据,交换给磁盘.(但是PCB还在内存中)因为这个速度快慢是相对于cpu来说的,显示器的响应是很慢的,我们在等待IO,而且是99%的时间都在等待,只有1%的时间在运行。在该状态的进程,无法被OS杀掉,只能通过断电,或者进程自己醒来来解决->在高IO的情况下,才会出现。
2023-10-31 11:30:00
83
原创 【Linux】文件权限、目录权限、掩码、粘滞位以及相关指令
权限是约束人的(一个或者是某些群体)目标对象(电影网站,音乐app等),本来就没有对应的属性(业务)权限:一件事情是否允许被谁做文件权限=人+文件属性目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。
2023-10-22 12:00:00
411
原创 【Linux】基本操作指令汇总(不完全)
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般用户,不能直接使用kernel. 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。操作系统存在的意义:操作系统对软硬件进行合理管理(手段),以达到为上层用户提供良好的、稳定的、安全的运行环境的目的(目的)。
2023-10-21 13:58:49
262
原创 【Cpp】哈希之手撕闭散列/开散列
底层是哈希表,迭代器遍历是无序的,是单向迭代器其他的用法和map,set没有什么区别unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
2023-05-24 21:29:41
1065
原创 【Cpp】前K个高频单词-排序的稳定性
set本身也可以排序,只不过也需要我们自己写一个仿函数。直接将sort换成stable_sort就可以了。但是这样写是不能通过的,因为sort的排序是。我们可以直接先将每个单词出现的次数用一个。改写一下仿函数的书写规则。统计出来,然后放入一个。
2023-04-27 09:49:53
486
原创 【Cpp】set\map详解(关联式容器)
根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器.kw=setset是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。
2023-04-26 08:30:00
927
原创 【日常刷题】从前序和中序遍历构造二叉树
相信大家已经做了很多类似的选择题了,就是把根据前序和中序或者根据中序和后序构造出原来的树(注意:不能够根据前序和后续复原,必须要有一个中序)具体的做法就是我们根据前序或者后序可以却确定一个数的根(最左或者最右),然后根据中序来划分左右子树,接下来再继续递归进行,链接左子树和右子树。给出一棵树的前序遍历和中序遍历,请构造这颗二叉树。对前序进行遍历,注意,为了保证整个函数中只有一个。(别名),来保证previ可以遍历所有的前序数组。我们设置一个新的变量。
2023-04-24 08:30:00
59
原创 【Linux】命名管道使用示例-代码实现
要使用管道进行通信,我们需要两个"人",一个是客户端,一个是服务器.且为了方便代码的编写,我们将两者公用的结构体和头文件放在同一个。该文件拥有者所在组的其他成员对该文件拥有读写的权限但是没有操作的权限。其他用户组的成员对该文件也拥有读写权限但是没有操作的权限。该文件拥有者所在组的其他成员对该文件拥有读写操作的权限。可以看到,其实就是一个无符号整型,不过系统帮我们封装了。该文件拥有者对该文件拥有读写的权限但是没有操作的权限。其他用户组的成员对该文件也拥有读写操作权限。该文件拥有者对该文件拥有读写操作的权限。
2023-04-23 08:30:00
962
1
原创 【Linux】共享内存(shm)代码实现
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据其中,pathname是路径字符串,proj_id是项目id这两个参数都可以随便书写,没有任何意义,只不过要保证不同的shm空间,这两个参数一定是不完全相同的.public :} else {int type;
2023-04-22 08:30:00
1084
原创 【日常刷题】根据二叉树创建字符串
给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
2023-04-21 08:30:00
54
原创 【Cpp】手撕搜索二叉树(KV模型)
问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?那么我后续即将介绍的。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。由于我的上一篇文章详细介绍了K模型的书写,KV模型与K模型的代码书写方面是别无二致的,只需要对于增操作多加一个value值即可.,查找效率代表了二叉搜索树中各个操作的性能。
2023-04-20 08:30:00
365
原创 【Cpp】手撕搜索二叉树(K模型)
/定义左子树 BSTreeNode < k > * right;//定义右子树 k _key;//存储关键码 BSTreeNode(const k & key) //构造函数 : _key(key) , _left(nullptr) , _right(nullptr) {} }上面我们已经把每个结点的结构定义出来了//将结点名字重新命名,方便后续写代码 public :这篇文章写的都是搜索二叉树的K模型.关于KV模型的代码手撕将在下一篇文章中,到时候查看我所写的博客即可.
2023-04-19 08:30:00
435
原创 【日常刷题】迷宫问题
定义一个二维数组 N*M ,如 5 × 5 数组下所示:它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。
2023-04-18 08:30:00
812
原创 【日常刷题】年终奖
小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
2023-04-17 12:02:25
75
原创 【日常刷题】找出字符串中第一个只出现一次的字符
这种有关字符个数的题,都可以使用"哈希法"进行求解,即新建一个数组,以字母的ASCll值为下标,存储数据,每多一个相关字符,该下标的值就加1,最后再遍历一边数组,找到对应值为1(即只出现一次)的字符,找到就直接break或者return,该方法的时间复杂度为。这种方法比较无脑,在面试的时候是在没有思路可以用,这里就不再赘述。输出第一个只出现一次的字符,如果不存在输出-1。找出字符串中第一个只出现一次的字符。数据范围:输入的字符串长度满足。即用两层循环(时间复杂度。
2023-04-14 08:30:00
678
原创 【日常刷题】洗牌_牛客网WY24
这道题其实洗牌不是难的,难的是怎么输入,一开始我没有看到第一个是n第二个是k,导致想了很久该怎么判断每组牌的开头结尾,但是仔细一看题目,发现第一个输入的其实就是n,只需要往后遍历2n个数据即可,然后进行洗牌。关于洗牌:就是很简单的将牌分成两组,一组是right一组是left,然后创建一个临时牌组ret,每洗一次牌,就将right和left的牌一次插入到ret中,之后将ret逆置(题目要求,是需要从上向下看),之后周而复始,直到洗牌次数为0。
2023-04-13 08:30:00
70
原创 【Linux】匿名管道代码实现-mypipe
我们在代码中需要做的,其实就是让父子进程看到同一份文件,对于父进程而言,只写该文件,对于子进程而言,只读该文件,即可进行进程间的通信以上文件具体内容及各自的作用将在下文中详细叙述.我们是在linux上进行编程,而不是VS之类的集成开发环境,因此,写一个makefile方便我们调试代码定义任务列表-task.hpp分阶段代码编写对于这个操作,其实我们在这个阶段已经做了很多次了,无非就是将不同的任务做成不同的函数,并且封装成函数指针数组,并在细节处不断解耦,已达到低耦合,高内聚的特点.首先,要使用函数
2023-04-12 15:06:17
663
原创 【日常刷题】最长公共子串
# 链接:https://www.nowcoder.com/questionTerminal/210741385d37490c97446aa50874e62d?
2023-04-10 13:53:23
65
原创 【Cpp】手搓优先级队列
1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2023-03-21 19:38:52
392
原创 【数据结构】计数排序
所以计数排序不适合数据大小比较分散的,适合范围集中的数据,并且只适用于整型。时间复杂度:O(N+range)空间复杂度:O(range)
2023-02-28 15:00:00
83
原创 【数据结构】二叉树与堆
*现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: = ) i = 0,1,2…将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。
2022-09-20 22:15:11
118
原创 【数据结构】栈和队列
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。
2022-09-13 11:54:13
79
原创 【力扣刷题】随机链表拷贝
138. 复制带随机指针的链表 - 力扣(LeetCode)技巧(非常巧妙的想法啊!)最难处理的是这里的random1.把copy结点链接在源结点的后面2.理解这行代码:3.拷贝结点剪下来链接到一起,回复原链表struct Node* copyRandomList(struct Node* head) { //1.将copy链接起来 struct Node* cur = head; while(cur) { struct Node* copy
2022-05-24 20:26:23
157
原创 【MySQL进阶】MySQL的数据目录详解
文章目录1 MySQL8的主要目录结构1.1 数据库文件的存放路径1.2 相关命令目录1.3 配置文件目录2 数据库和文件系统的关系2.1 查看默认数据库2.2 数据库在文件系统中的表示2.3 表在文件系统中的表示2.3.1 InnoDB存储引擎模式2.3.2 MyISAM存储引擎模式2.4 小结1 MySQL8的主要目录结构[root@atguigu01 ~]# find / -name mysql安装好MySQL 8之后,我们查看如下的目录结构:1.1 数据库文件的存放路径MySQL数据库
2022-04-15 23:53:49
685
原创 【MySQL进阶】linux环境下MySQL的卸载
文章目录1 查看是否安装过MySQL2 MySQL的卸载2.1 关闭 mysql 服务2.2 查看当前 mysql 安装状况2.3 卸载上述命令查询出的已安装程序2.4 删除 mysql 相关文件2.5 删除 my.cnf1 查看是否安装过MySQL如果你是用rpm安装, 检查一下RPM PACKAGE:rpm -qa | grep -i mysql # -i 忽略大小写检查mysql service:systemctl status mysqld.service如果存在mysql-lib
2022-04-14 22:36:43
1192
原创 【c语言刷题】写宏,将一个整数的二进制位的奇偶位互换
文章目录引言我们的思路是:那有什么方法能将一个数的奇数位全部保留,而偶数位置为0呢?同理,我们可以对偶数位做相同的操作。最后,我们需要了解:代码如下:引言这个题充分利用了c语言中二进制位的特点,非常巧妙首先,我们就假设我们要转换的数字是15,方便我们讲解15的二进制位(补码)为:00000000000000000000000000001111我们的思路是:先分别得到他的奇数位和偶数位,然后二者相加,其中,为了实现相加这个功能,我们需要将奇数位中的‘偶数位’置成0,将偶数位中的‘奇数位’也置成0
2022-04-13 22:14:16
366
原创 【c语言进阶】文件的预处理和编译
文章目录1 程序的翻译环境和执行环境2 详解编译+链接2.1 翻译环境2.2 编译本身也分为几个阶段2.3 运行环境3 预处理详解3.1 预定义符号3.2 \#define3.2.1 define定义标识符3.2.2 \#define定义宏3.2.3 \#define替换规则3.2.4 `#`和`##`3.2.5 带副作用的宏参数3.2.6 宏和函数的对比3.2.7 宏的缺点:3.2.8 命名约定3.3 \#undef3.4 命名行定义3.5 条件编译3.6 文件包含3.6.1 头文件被包含的方式3.6.1
2022-04-12 11:30:00
601
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人