- 博客(48)
- 收藏
- 关注
原创 项目1
http协议,超文本传输协议,是用于从www服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速的传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等。这就是你为什么在浏览器中看到的网页地址都是以”http://”开头的原因。 由于HTTP协议是基于请求/响应方式的(相当于客户端/服务器)。一个客户端与 我们的http服务...
2018-09-07 18:32:41 310
原创 日期类
#include "date.h"class Date{public: Date(int year = 1900, int month = 1, int day = 1)//构造函数 :_year(year) , _month(month) , _day(day) { if (!IsInvalid(_year,...
2018-07-28 15:36:29 193
原创 浅拷贝&深拷贝&引用计数
当类里面有对象时,进行简单的赋值的浅拷贝,当s1和s2中包含的指针对象同时指向一块内存,析构时delete了两次这个内存,会出错, 存在崩溃的问题。这里我们需要深拷贝。 构造s2时拷贝一块跟s1指向数据块一样大的数据块,并将值拷贝下来,这样s1和s2指向各自的数据块,析构时释放各自的数据块。浅拷贝存在析构多次的问题,深拷贝又会浪费空间,有没有更好一点的方法呢? 为了解决浅拷贝中同一...
2018-07-27 10:08:45 504
原创 new/delete new[]/delete[]
C语言使用malloc/realloc/calloc/free进行内存管理。C++通过操作符new和delete进行内存管理。new/delete动态管理对象,new[]/delete[]动态管理对象数组。void Test(){ int* p1 = new int;//动态开辟4个字节空间(一个int)单个数据 int* p2 = new int(3);//动态开辟4个字节...
2018-07-26 18:03:34 350
原创 C++继承
继承继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西。函数复用是为了调用它,而类复用是继承它。 继承的三种关系:public(共有),protected(保护),private(私有)。 一个简单的继承关系: class Person{public: Person(const string& nam...
2018-07-26 15:47:59 142
原创 C++ 类和对象
面向对象是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和扩展性。把一组数据结构和处理他们的方法组成对象,把相同行为的对象归纳为类,通过对类的封装隐藏内部细节,通过继承实现类的特化/泛化,通过多态实现基于对象类型的动态分派。C++不是纯面向对象语言,而是基于面向对象的语言。因为它包含C的部分,而C...
2018-07-21 18:04:12 151
原创 C++ 引用和指针
引用引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。对引用的操作与对变量直接操作是完全一样的。引用的声明方法:类型&引用变量名 = 已定义过的变量名引用的特点:1.一个变量可取多个别名 2.引用必须初始化 3.引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。引用用法void Test1(){ int a = 1;...
2018-07-19 16:18:52 127
原创 C++入门
C++C++是一种面向对象的计算机程序设计语言,它是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持多重过程化程序设计,数据抽象,面向对象程序设计,泛型程序设计等多种程序设计风格。C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的设计语言。 为什么会有C++?计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。C语言不是为初学者设计的,而是为计...
2018-07-19 11:21:56 291
原创 数据结构_堆
堆是一个完全二叉树堆有两种, 一种叫小堆(小根堆, 最小堆), 一种叫大堆(大根堆, 最大堆)。以小堆为例, 这个树的根节点是这个树中的最小的元素,对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值。以大堆为例, 这个树的根节点是这个树种的最大元素,对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值。在我们不想开辟额外的空间, 或者消耗额外的时间的前提下, 如果我们想...
2018-06-03 21:26:04 240
原创 Linux_网络基础1
局域网:是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米内。局域网可以实现文件管理,应用软件共享,打印机共享等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司的上千台机器组成。 主要特点:覆盖的地理范围小,只在一个相对独立的局部范围内联,如一座或集中的建筑群内。使用专门辅设的传输介质进行联网,数据传输速率高通信延迟时间短,可靠性较高局域网可以支持...
2018-05-25 09:39:50 233 1
原创 数据结构_二叉树相关操作
二叉树的表示方法有很多种:双亲表示法,孩子表示法,双亲孩子表示法,孩子兄弟表示法。 在这里我们用孩子表示法 创建二叉树树的拷贝 首先,拷贝分两种:浅拷贝和深拷贝 浅拷贝:两个对象同时指向同一块内存,修改一个,另一个也会被修改。 深拷贝:原有所有对象,包括内存复制一份。 fork 中的拷贝是特殊的拷贝,刚开始时浅拷贝,这样减少了空间浪费。要修改时的一瞬间,再深拷贝。 树的拷...
2018-05-23 11:34:57 198
原创 树与二叉树的基本概念
一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两颗分别称为左子树和右子树的二叉树组成。 二叉树的特点:每个节点最多有两棵子树,即二叉树不存在度大于2的节点。二叉树的子树有左右之分,其子树的次序不能颠倒。满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,而且所有叶子节点都在同一层上。 完全二叉树:如果一棵树具有N个节点...
2018-05-23 11:04:53 7079
原创 迷宫求解
回溯法要实现迷宫,首先得知道回溯法,回溯法又称试探法,是一种选优搜索法,按选优条件向前搜索,以达到目标。回溯法采用试错的思想,它尝试分步的去解决一个问题。在分布解决问题的过程中,它尝试发现现有的分布答案 不能得到有效的正确的解答的时候,它将取消上一步甚至上几步的计算,再通过其他的可能分布解答再次尝试寻找问题的答案。深度优先搜索是搜索算法的一种,它的策略是尽可能深的搜索某一分支。在深...
2018-04-24 23:04:20 172
原创 线程
线程概念在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。这里的内部是指指向同一个地址空间。一切进程至少都有一个执行线程。进程和线程进程是系统分配资源竞争的基本单位。线程是程序执行的最小单位。线程共享进程数据,但也拥有自己的一部分数据:线程ID,一组寄存器,栈,errno,信号屏蔽字,调度优先级。 同一地址空间,因此Text...
2018-04-22 15:49:30 143
原创 进程间通信
进程间通信进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在什么双方都可以访问的介质呢?进程的用户空间是相互独立的,一般而言是不能相互访问的,唯一的例外是共享内存区。但是,系统空间却是”公共场所“,所以内核显然可以提供这样的条件。除此之外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过”注册表“或其他数据库中的某些表项和记录交换信...
2018-04-22 11:12:25 126
原创 将二元信号量P/V操作,封装成动态/静态库,并分别使用并测试
P,V操作 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。 ftok函数,先不去了解它的作用来先说说为什么要用它,共享内存,消息队列,信号量他们三个都是找一个中间介质来进行通信的,这种介质多的是。就是怎么区分开来,就像唯一一个身份证来区分人一样。只要唯一就行,就想起来了文件的设备编号和节点,它是唯一的,但是直接用它来做识别好像不太好,不过可以用它来产生一个号。ftok()就出...
2018-04-22 11:04:38 489
原创 调研同步与互斥概念原理,了解生产者消费者原理
现代操作系统提供了一个并发控制环境,即系统中同时活动着多个不同的进程,这些进程共享同一个CPU,内存或I/O设备。特别是对于linux操作系统来说,其多任务,多用户,分时实时混合的性质决定了多个进程在某种程度上彼此依赖或相互制约的关系,这些关系我们叫“并发关系”,按其性质可以分为同步和互斥两类。进程互斥由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为...
2018-04-21 11:11:43 426
原创 练习ipcs -q/m/s于ipcrm -q/m/s的使用,并总结
ipcs:显示IPC资源。是Linux上提供一些进程间通信方式的信息,包括共享内存,消息队列,信号。ipcs -a 是默认的输出信息,打印出当前系统所有的进程间通信方式的信息。ipcs -q 打印出使用消息队列进行进程间通信的信息。ipcs -m 打印出使用共享内存进行进程间通信的信息。ipcs -s 打印出使用信号进行进程间通信的信息。ipcrm:手动删除IPC资源。移除一个消息对象。或者共...
2018-04-18 16:53:23 862
原创 数据结构链式队列
对队列进行以下操作:1.入队列2.出队列3.取队首元素队列先进先出,要想实现入队列,从队尾插入元素;要想实现出队列,从队首删除元素。在这里,我们定义头尾指针,首先对空队列插入元素,让头指针等于尾指针,如果非空,依然让头指针指向队首,尾指针指向要插入的元素。删除元素时,直接让头指针指向下一个元素,要删除的元素就成了无效的元素,这也就完成了头删。取队首元素时,函数的返回值代表是否取成功,0表示失败,1...
2018-04-16 17:42:03 368
原创 模拟实现shell,使它支持重定向功能
我们都知道用户是通过操作系统来对我们的硬件或者软件进行操作的,但是我们平时在使用计算机的时候并没有直接与操作系统进行交流。而在linux下我们通常通过终端输入命令,但是你有没有想过为什么我们在终端输入命令,操作系统就能认识呢?这中间存在一个命令行解释器shell,也就是所谓的外壳程序,来对我们输入的命令进行解释,调用相关的系统调用接口,从而实现各种操作。在这里我们就来模拟一个shell。要模拟sh...
2018-04-16 14:43:36 787
原创 编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用
静态库(.a):在windows下后缀为(.lid),程序在编译链接的时候把库的代码链接到可执行文件里。程序运行的时候将不再需要静态库。动态库(.so):在windows下后缀为(.dll),程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机...
2018-04-15 21:10:16 3772
原创 练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体
写文件#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>int main(){ umask(0);//在创建新文件或目录时屏蔽掉新文件或目录不应有的访问允许权限 int fd = open("file",...
2018-04-15 17:05:36 364
原创 数据结构顺序队列
对队列进行1.入队列2.出队列3.取队首元素队列先进先出,允许在一端进行插入操作,另一端进行删除操作。允许插入的一端称为队尾,允许删除的一端称为队首。我们head和tail标记队首和队尾。出队列时,将head向后移动,入队列时,将tail向后移动,再给tail赋值。为了方便判断队列是否满了,我们让head指向头部,tail指向队列最后一个元素的下一个位置,[head,tail)。tail移动到最后...
2018-04-15 16:37:33 281
原创 带头节点的不带环的单向链式栈的基本操作
完成链式栈 1.初始化 2.销毁 3.入栈 4.出栈 5.取栈顶元素 如果LinkStack stack定义的stack是在栈上的,那么它结构体里面的head也是在栈上的;但如果stack是malloc出来的,像这样(LinkStack* stack=malloc( )),那head变量就在堆上。head究竟是在栈上还是堆上,得看它所属的具体在哪。seqstack.h//单向带头结点的不带...
2018-04-13 15:20:44 318
原创 完成顺序栈的基本操作
1.初始化 2.销毁 3.入栈 4.出栈 5.取栈顶元素 seqstack.h#pragma once #include<stdio.h>#include<stddef.h>#include<stdlib.h>typedef char SeqStackType;typedef struct SeqStack{ SeqStackType* data;//指针类型,...
2018-04-09 14:47:02 486
原创 数据结构:带头节点带环的双向链表
1.尾插2.尾删3.头插4.头删5.查找指定元素的位置6.在指定位置之前插入元素7.在指定位置之后插入元素8.删除指定位置的元素9.删除指定值的元素10.删除指定所有相同的元素11.求链表的长度12.判断链表是否为空dlinklist.h//双向的带环的带头结点链表#pragma once#include<stdio.h>#include<stdlib.h>#include...
2018-04-08 10:50:40 201
原创 封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递
2018-04-07 11:35:12 377
原创 学习进程创建, 等待, 终止. 使用代码实现.
进程的创建3153先打印before消息,然后打印after,另一个after消息由3154打印的。fork之前父进程独立执行,fork之后,父子两执行流分别执行。fork之后,谁先执行完全由调度器决定。进程等待(waitpid)从本质上讲,waitpid和wait的作用是相同的,但waitpid多出了两个可由用户控制的参数pid和optionspid_t waitpid(pid_t pid,in...
2018-04-07 09:24:59 285
原创 调研popen/system, 理解这两个函数和fork的区别.
system函数在执行过程中经过fork->exec->wait,但system在执行的过程会一直等待,知道shell运行完才退出,所以system为串行执行syetem在执行的过程中对SIGCHLD、SIGINT、SIGQUIT都做了处理SIGCHLD是子进程在退出时给父进程发的一个信号,system中屏蔽了SIGCHLD信号,原因是为了system调用能够及时的退出并且能够正确获得...
2018-04-05 11:21:14 250
原创 数据结构_完成单链表的后续操作实现以及链表面试题
1.初始化链表2.尾插一个元素到链表中3.尾删一个元素4.头插一个元素5.头删一个元素6.查找元素在链表中的位置7.在pos之前插入元素8.在pos之后插入元素 9.删除指定位置的元素10.删除指定值的元素11.指定值的所有相同元素都删掉.12.判定链表是否为空13.求链表的元素个数14.逆序打印单链表15.不允许遍历链表, 在 pos之前插入16.实现约瑟夫环17.单链表逆置18.单链表逆置(删...
2018-04-03 19:41:44 351
原创 调研进程调度算法
在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度适用于进程调度,有的调度算法两者都适用。进程调度算法:在系统角度来说,公平性:每个进程(不论优先级)都会有机会被运行;较大的吞吐量。用户角度:及时性:响应速度快;较短的周转时间,不应当让用户等待时间过长。常见的调度算法:1.时间片轮转法:在分时系统中,都采用时间片轮回转法。简单轮回法:系统将所有就绪进程按FIFO规则排队,按一定...
2018-03-21 15:42:09 368
原创 使用代码模拟实现僵尸进程, 孤儿进程的场景
僵尸进程(Z):一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出代码。所以只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。Z状态一直不退出,PCB(task_struct)一直都要维护。一个父进程创建了很多子进程,就是不回收,就会造成资源的浪费。因为数据...
2018-03-19 14:29:52 152
原创 实现基于静态数组的顺序表的以下基本操作:
实现基于静态数组的顺序表的以下基本操作:1. 初始化2. 尾插3. 尾删4. 头插5. 头删6. 读任意位置元素7. 修改任意位置元素8. 查找指定元素值的下标9. 在任意位置插入元素 10.删除顺序表中指定的值, 如果存在重复元素, 只删除第一个11.删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本12.获取顺序表元素个数13.判...
2018-03-18 20:49:27 217
原创 调研task_struct结构体, 理解结构体中的各个字段的含义.
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。task_struct结构:1.进程状态,将记录进程在等待,运行或死锁。2.调度信息,由哪个调度函数调度,怎样调度等。3.进程的通讯情况4.因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型5.时间信息,比如计算好执行的时间,以便cpu分配。6.标号,决定...
2018-03-17 11:34:24 255
原创 1.回调函数的使用 2.练习使用qsort函数排序各种类型的数据
1.回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调其所指向的函数时,我们就说这是回调函数。回调函数不是有由函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于该事件或条件进行响应。2....
2018-03-15 23:11:11 188
原创 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
1.指针数组:指针数组是数组,是一个存放指针的数组。例:int *arr1[10] ;整型指针数组 char *arr2[4] ;字符指针数组 char **arr3[5] ;二级指针数组2.数组指针:是指针。(数组的地址)。指向数组。给数组指针+1,指向所指向数组的大小。例:int (*p)[10]整型数组指针。解释:p和*先结合,说明p是一个指针变量,然后指针指向是一个大小为10...
2018-03-15 23:00:02 151
原创 1.研究 sscanf sprintf 2.研究 fread fwrite
sscanf作用:从一个字符串中读进与指定格式相符的数据。原型:int sscanf(const char *str,const char *format,......);说明:sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。成功则返回参数数目,失败则返回0。sscanf与scanf类似,都是用于输入的,只是scanf以键盘(std...
2018-03-13 21:07:45 216
原创 自行调研Linux下软件安装的几种方式(源码安装, rpm安装, yum安装). 重点要理解rpm安装和yum安装的区别.
1、源码安装。源码安装的步骤:编译源码,然后安装。<1>安装准备a.首先用yum安装gcc,用于编译源码b.官网下载源码包c.winSCP windows与linux传输文件(如果直接用要安装的linnux电脑下载就不用传输了)<2>安装过程a.解压b.进入解压后的目录配置软件 ./configure#大多数情况下源码包都会带configure这样一个配置工具,具体使用方...
2018-03-12 15:24:35 569
原创 为什么调试的时候需要编译选项中添加 -g. 请自行调研readelf命令
用gdb进行调试纠错前必须要在编译选项中添加“-g”,“-g”标志是对程序进行调试性编译时常用的选项。我们需要给每一个需要调试的源文件都加上这个选项。它将使用特殊版本的C语言标准库完成编译和链接操作,给库函数加上程序调试方面的支持。编译器会把这些标志自动传给链接器。readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表...
2018-03-12 14:36:45 828
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人