自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 UDP、TCP网络通信

3.sin_addr.s_addr : 网络地址。传入的肯定是一个字符串,但是网络中需要的是4字节 IP,需要的是网络序列的 IP,因此又需要转换。这里的第二个参数是 struct sockaddr* ,而填充的时候用的是struct sockaddr_in,因此需要强转如下。参数分别为:fd,缓冲区和缓冲区的大小(读出的数据放在哪里,期望接受多少数据),flags设置为0表示为阻塞读取。后两个参数为:输入型参数,这两个参数放的就是谁给我传的网络信息,放的就是对方的 IP 和 port。

2025-03-31 22:47:24 833

原创 管道的通信

为了提升效率,提前创建好各个进程,然后当任务来临时,父进程将任务写入对应的管道,子进程在对应的管道读取任务,也就是说通过管道下发任务让各个子进程去完成。4.管道还在写,但是read fd 关闭了,则这种管道就称为:broken pipe(坏的管道),这种情况下,OS会直接杀掉 写入 的进程,就是异常情况,直接使用13号信号杀掉。3.管道一直在被读,但是write fd 关闭了,并且该进程直接关闭了对管道的描述符,则读端进程读完有效数据后 read 返回值会读到0,表示读到了文件结尾。

2025-01-15 15:53:40 830

原创 软硬链接和动静态库

IO

2025-01-14 16:54:09 860

原创 哈希hash

查找函数在线性探测的过程中进入循环是该位置不为空,循环内部判断当前位置值是否为所需要查找的值时,需要先判断该位置的状态为存在,再进行值得比较才可以。对于字符型数据,如果只取首字符很明显重复率很高,取单词的所有字符值的和也会很高(因为有aabb abab bbaa这样的数据会导致他们的和相同),因此有一个方法如下:对每个字符乘131然后再相加。2.如果存一个11,但是位置被占了,11存到了下标5的位置,但是我先把33删了,那个从11开始查,查到3的位置为空了,就停止了。相当于数组元素为一个一个的指针。

2025-01-13 11:02:55 848

原创 文件系统的存储方式

是一个固定的集合体,一般是128字节,一个文件一个struct inode,而inode table存放这个分组内文件的属性的结构体,也就是说存放每一个文件的struct inode。在这个结构体中,inodenum存放的就是inode编号,datablocks中一个位置映射一个空间,而一般只有12个位置是直接索引的4KB使用空间,剩下的三个位置映射的4KB空间存放的是映射其他位置的空间。目录也是文件,目录的内容存放的是该目录下的文件名和inode编号的映射关系。对于一个被打开的文件,会保存一个路径信息。

2024-11-19 17:18:44 426

原创 重定向和缓冲区

实现一个小的文件描述符,并使用它进行文件操作

2024-11-18 18:54:23 275

原创 封装map、set

map和set的实现

2024-11-15 20:05:21 187

原创 文件fd内容

文件fd

2024-11-14 17:13:42 907

原创 红黑树分析

红黑树

2024-11-13 20:49:59 428

原创 进程的程序替换exec*函数和shell实现

strtok(str, const char* “b”) - - - 把字符串str,按照b字符去分割,返回值是从左向右分割的第一个子串,只需要第一次调用时传str,最后传NULL,就可以分割完。3.把bash给的环境变量改一改传入,putenv(XXX) - - - 把XXX环境变量添加到bash的环境变量中,然后传bash环境变量时就会有XXX这个环境变量。下面的C调用C++就是例子。snprintf(A,B,“C”) - - - 把C中的东西写进A中,A的大小为B,B就是sizeof(A)

2024-11-13 14:51:22 1006

原创 AVL树的旋转

AVL树

2024-11-08 20:10:47 1005

原创 进程的控制

pid - - - 需要等待的进程pid,pid = -1 说明设置父进程等待任何一个子进程退出,与wait作用相同。- - - 获取父进程bash获取到的最近一个子进程的退出码。当子进程没有退出时,父进程在waitpid()就是在阻塞等待,进程在阻塞等待,等到后父进程才开始运行。当一个进程退出时,会把自己的退出码和退出信号写入自己的PCB中,这样父进程就可以获取到子进程的退出信息得到进程的退出状态。fork()函数:子进程返回0,父进程返回的是子进程的pid - - - 方便父进程对子进程标识。

2024-11-07 20:15:13 799

原创 map和set的基本使用

如果 x 不存在,则先调用插入make_pair(x,V()),插入成功或者失败都会返回个 pair< iterator, bool>,iterator 指向 x 的迭代器,bool 为判断 x 是否是新插入的,然后拿出pair 的 iterator 为指向 x 的 iterator it,然后it->second 为返回的value。如果找的 key 存在,插入失败,返回一个pair< 存在的key的节点迭代器,false >。set::lower_bound(x):找的是 >= x 的值。

2024-11-07 15:53:01 448

原创 二叉搜索树

左右都不是空 替换法删除 找到cur左子树最大的或者cur右子树最小的和cur的数值进行替换,替换完后把cur左子树最大的或者cur右子树最小的节点删掉。如果删除的节点cur右为null,则让cur的parent指向cur的左,下图是左为空的处理情况。如果删除的节点cur左为null,则让cur的parent指向cur的右。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。平衡二叉树可以解决上述最差情况。它的左右子树也分别为二叉搜索树。

2024-11-06 19:34:11 477

原创 多态的内容

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态必须在继承的条件下产生。多态的条件:1.父类完成虚函数重写(一般子类也写虚函数看着更清楚),虚函数需要完成函数名、参数类型、返回值相同。2.父类的指针或者引用去调用虚函数。在继承里,同名函数被隐藏,要想调用方的话得指定是在父类中的函数才能调用,而多态就解决了这个问题。多态的调用:运行时,到指向对象的虚表中找虚函数调用,指向父类调用父类虚函数,指向子类调用子类虚函数。普通调用:编译时,调用对象是

2024-11-05 19:25:29 955

原创 继承的内容

基类的private成员派生类怎样继承都是不可见(不能被直接访问)成员,但如果父类有public函数可以调用父类私有成员的话,可以在派生类中调用父类中的public成员去访问父类私有成员。继承的写法如下述代码所示:再代码中,基类的name和age都是portected,因此都是受保护的可以继承,继承后不能修改,但如果是基类的私有成员,继承后派生类中不可见。也就是说,对于很多都会共有的信息放在一个大类中,然后对于各个对象而言,想创建自己的信息类,可以继承一下大类,再添加一些自己特有的信息就行了。

2024-11-04 20:13:43 986

原创 命令行参数、环境变量、地址空间

因为环境变量路径被加载到PATH中被bash拿到,因此直接使用程序不用加上路径,而自己生成的可执行程序是没有被加载到环境变量中,因此需要指明路径。可以直接自己创建一个环境变量, export: 设置一个新的环境变量 - - - export XXX=yyy,如果不存就是在本地文件内的环境变量。fork()的返回值有两个,一个是父,一个是子,而fork是父进程的值,因此会发生写时拷贝,写时拷贝会导致好像同一个变量有不同的值。安装软件相当于把自己的程序加载到环境变量路径中,也就是usr/bin路径中。

2024-11-04 17:19:38 750

原创 进程的状态和优先级

Z - - - 僵尸进程:一个进程退出之后不会立即退出,而是看该进程的父进程会不会对其回收,回收后的才是真正的退出了进程,如果不回收就是僵尸进程,[test]< defunct >。一个进程退出,进程的代码和数据可以释放,但是进程的PCB得维持让父进程读取。使用-19的暂停是 T ,在调试的过程中,遇到断点进程停下来是 t ,T 是纯粹的暂停, t 是因为进程在追踪而停下来的,这两基本没啥区别,都是暂停了。进程在调度printf的时候需要访问显示器,因此只有在打印的时候进程才会是R+状态,不然是S+。

2024-11-02 21:37:52 381

原创 冯诺依曼体系、操作系统、进程

fork()是一个系统调用函数,这个函数会在函数内部就把子进程生成,生成后走到fork的结尾就是返回一个id,而在函数中已经产生了两个进程,那么他们会各自返回自己的 id,这样就好像是有两个返回值一样可以在一份代码中即走 if 又走 else。一个可执行程序如果没有被运行的时候是存在于磁盘中的,程序运行起来首先要先加载到内存中,但其实加载的不是进程,而是加载的数据先在内存中。fork之后的代码父子进程共享。只要进程的task_struct{}在不同的队列中进程去访问不同的资源,这就是进程的动态运行。

2024-10-30 20:13:40 966

原创 gdb、git

2024-10-30 15:05:22 311

原创 容器适配器、仿函数、优先级队列、deque、stack和queue题目

pop时,得先判定是否应该popstmin,如果先st.pop,则会导致判定的st的值已经被pop了。deque 头插尾插效率很好,但中间插入比较麻烦需要整体挪动,局部挪动,效率一般。vector:优点:支持下表随机访问,缺点:头部或者中间删除效率低+扩容有小号。栈和队列的默认容器是 deque,而栈和队列只需要头尾插入。list:优点:任意位置插入删除效率不错,缺点:不支持[]下标访问。队列经常用来广度优先遍历,也就是二叉树的层序遍历。deque:双端队列,但其实不是队列。上述图片是适配器实现的栈。

2024-10-29 15:46:04 273

原创 编译链接-makefile-进度条

2024-10-28 19:58:24 131

原创 list 的实现

顺序表可以用原生指针代替迭代器的指针,但链表不可以,链表的指针++并不能够保证找到下一个节点的位置。下述代码为list的迭代器代码,对于拷贝构造使用浅拷贝就可以,因为只需要让另一个指针指向当前节点的资源,而链表不可以浅拷贝。const迭代器是迭代器指向的内容不能修改而不是迭代器本身不能修改,而const iterator是iterator不能修改,因此不满足需求。对于下述代码自定义类型A而言,如果想用迭代器->读取A的内容,就需要在迭代器中重载->,也就是定义的模板 Ptr 函数。

2024-10-26 15:34:10 547

原创 list使用

splice:splice可以在自己的链表上操作,也可以把别的链表的部分转移到这个链表上。splice = transfers 转移 把一个链表中某些节点转移到别的位置去。转移是把链表的某些部分转移到让它去的位置的后面。如果把 lt1 转移到 lt2 上面,则 lt1 就没有节点了。list insert 不会失效, erase 会失效。insert 是在pos位置前面插入,pos是一个迭代器位置。vector insert/erase 会失效。clear 不会清除哨兵位节点。

2024-10-25 19:34:45 500

原创 linux-yum-vim-sudo提权

2024-10-25 16:47:13 157

原创 linux权限

2024-10-24 21:17:26 105

原创 linux基本指令

2024-10-22 20:19:15 111

原创 手写vector

【代码】手写vector。

2024-10-21 15:49:45 108

原创 STL-vector+题目

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。迭代器是容器通用的访问方式,使用方法基本相似。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。vector在[ ]和迭代器、范围for方面的使用差不多一样。vector的迭代器有普通的还有const类型的迭代器。输入:nums = [4,1,2,1,2] 输出:4。输入:nums = [2,2,1] 输出:1。输入:nums = [1] 输出:1。

2024-10-20 20:13:44 212 1

原创 手写string类+题目

内置类型默认生成的operator=赋值,会完成浅拷贝,自定义类型会去调用它自己的赋值运算。对于string这种需要申请空间的类而言,浅赋值也会导致空间连续释放崩溃,因此也得自己写,销毁原来的空间,开辟一样大的空间,把值拷贝过去。类中自带的拷贝函数是浅拷贝,浅拷贝只是让创建的新的一个名字指向原来地址的内容,这样对于申请空间需要释放空间的类来说,析构的话会导致多次析构同一块内容,会崩溃。但是深拷贝是重新创建一个空间,将原数据拷贝到新空间,再将新空间给你创建的那个新对象,这样自己析构自己的空间,就不会出问题。

2024-10-19 19:42:09 278

原创 STL-string+题目

string

2024-10-16 18:39:27 271

原创 内部类、内存管理、malloc和new的差别、模板

内存

2024-10-15 20:14:54 266

原创 初始化列表、静态成员、友元

解:创建一个Add类,n是多少就创建大小为n的Add类型的数组,这样在Add的构造函数定义++,对static类型的数据进行++,就可以完成求和。比如Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。),A中可以访问B,B不能访问A。

2024-10-11 14:23:35 921

原创 创建日期类、const成员函数、日期类题目

这样去写代码,要声名是在Date类中的。将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。缺省参数在.h文件和.cpp文件中不能都有,一般是在.h的声名中声名缺省值,在.cpp中不写缺省参数。下述代码就直接实现了,不写.h文件的东西。const在*之前修饰的是指针指向的对象,在之后修饰的是指针本身。在下面的代码期望的是const限定this指针指向的内容不被修改。

2024-10-10 17:42:13 394

原创 构造、析构、拷贝构造、赋值运算符重载

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主。类里面的成员函数什么都不写的时候,编译器会自动生成6个成员函数。(可以有多个构造函数)

2024-09-29 20:00:50 339

原创 类和对象1

和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private。类中,使用类数据和方法都封装到一下。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类,这里就是1。

2024-09-29 16:43:28 927

原创 域 缺省参数 函数重载 引用 编译链接

如果用C++写的程序提供接口函数给使用者,C++使用者可以直接使用,但如果是一个C使用者调用函数会找不到地址,因为在汇编过程中C使用不修饰的函数名找调用函数,而C++在汇编会产生修饰的函数名,因此无法调用。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译,不要用C++的规则修饰函数名去编译。

2024-09-27 20:03:34 1310

原创 排序的总结

之前的排序中,都是只能内排序,只有归并排序可以内也可以外排序。归并排序的思想可以应用在外排序中。数组中相同的值排完序以后相对顺序不变就是稳定的,否则是不稳定的。外排序:数据量较大,内存中放不下,数据放到磁盘文件中排序。内排序:数据量相对少一些可以放在内存中排序。冒泡插入归并是稳定排序,其他不是。

2024-09-26 19:38:49 260

原创 归并排序,外排序,计数排序(非比较排序)

归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。1.最后一个小组归并时,第一个小区间不够gap个,则不需要归并 不处理时OK的 因为他同样满足第二个小区间不存在,因此不处理OK。代码控制中有个gap,gap是1 就是11归(两个相比),gap是2就是22归(四个相比), gap是4就是44归(八个相比)。也就是:假设左边有序,右边有序,然后合并在一起归并后就有序。快排是前序,归并是后续。

2024-09-26 17:18:24 397

原创 排序(交换排序:快排)

如果是right先走,最坏在遇见left的时候停止,而这个位置是left的位置,值肯定是比key小的,但left先走的话,最坏情况遇见right,此时值是比key大的,交换会出问题。挖坑法:将key的位置看作是一个坑(hole),然后利用part1的思路,找到大的将值放进坑中,然后此时right就是hole,再找小的值,将小的值放进hole中,此时left是坑…理想的情况下:每次排序都是二分,直到二分到最后,那就相当于递归高度次(logN),每一层单趟排都是O(N),时间复杂度O(N。

2024-09-25 16:01:52 432

空空如也

空空如也

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

TA关注的人

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