- 博客(74)
- 收藏
- 关注
原创 Linux系统编程--实现简单shell
上个博客我们讲了进程如何替换,以及exec函数族是,接下来我们来应用这些函数以及之前学的知识来实现一个简单shell。如果不太清楚,请先看看之前的内容;1.进程创建2.进程等待3.进程替换我们先看系统的shell是如何实现?我们敲一行命令,然后按回车,这个命令就被执行,玩了之后他他又返回到原来的状态,这个命令还可以加上选项,例这些选项之间用空格间隔开。并且空格可以是多个。如下图,从...
2018-11-03 20:17:02
702
原创 Linux系统编程---进程替换
进程替换我们知道,在 Windows 平台下,我们可以通过双击运行可执行程序,让这个可执行程序成为一个进程;而在 Linux 平台,我们可以通过 ./ 运行,让一个可执行程序成为一个进程。但是,如果我们本来就运行着一个程序(进程),我们如何在这个进程内部启动一个外部程序,由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现。并且,我们通常fork一个...
2018-11-03 17:01:59
258
原创 Linux系统编程---进程等待
进程等待1.为什么需要进程等待我们知道,子进程退出,父进程如果不管不顾,那么子进程就可能变为僵尸进程,进而占用系统资源,造成内存泄漏,另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill-9也无能为力,因为谁也办法杀死一个已经死去的进程。有时候我们需要知道父进程派给子进程的任务完成的如何如,子进程运行完成,结果对还对,或者是否正常退出。在这些情况,我们需要等待子进程执行完。...
2018-11-02 12:30:29
397
原创 Linux系统编程---进程终止
进程终止进程的退出有三种场景:代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止进程退出方法从main返回调用exit函数调用_exit函数ctrl + c :x信号终止其中前三种为正常退出,而第四种是异常退出。在终端可以使用命令 “echo $? ”查看进程退出码接下来我们来看进程推出的函数有哪些_exit函数#include <u...
2018-10-30 21:01:33
1049
原创 LeetCode---两数相加
两数相加(中等)给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807/** * Definit...
2018-10-28 22:32:41
1008
原创 Linux网络编程---详解HTTP协议
HTTP 简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP 工作原理HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过UR...
2018-10-26 21:56:40
4061
原创 排序算法4---堆排序
堆排序基本思想: 大堆对应升序序列,小堆对应降序队列,我们从最后一个非叶子结点建堆,步骤如下:⑴ 将堆顶元素与当前最大堆的最后一个节点交换⑵ 最大堆节点-1,即调整剩下的n-1个节点⑶ 从堆顶继续向下调整,试之满足最大堆,循环⑴和⑵ ,直至剩下一个节点。时间复杂度: NlogN稳 定 性 :不稳定适用场景:topK等问题void AdjustDown(int *arr, int r...
2018-10-24 18:25:15
204
原创 Linux网络编程---详解TCP的三次握手和四次挥手
我们知道,在TCP/IP协议中,TCP协议提供可靠的连接服务,是因为它有许多保证可靠连接的机制。可以分为3个方面:1.确认应答机制:指的是不管哪一端发送数据都需要确认回复一下。2.超时重传机制,发送后等待一段时间,不管是发送失败或者是还没有收到回复,那么就认为数据传输失败了;此时将会数据重传。这个超时是递增变化,但次数有限制,超过了重传次数就认为网络断开了。3.序号/确认序号 :序号不一定从...
2018-10-21 18:14:41
1713
原创 Linux系统编程 ---系统调用
系统调用系统调用就是用户在程序中调用操作系统所提供的一些子功能,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/0传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多。这些系统调用按功能大致可分为如下几类:设备...
2018-10-20 21:56:00
610
原创 排序算法3---选择排序
选择排序基本思想:每一趟(例如第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素,待到第n-2趟做完,待排序元素集合中只剩 下1个元素,排序结束。时间复杂度: O(n^2)空间复杂度: O(1)稳 定 性 :不稳定适用场景:数据量较小,交换次数比较少我们首先来看第一个版本选择排序(单边缩小空间)基本思想:我们定...
2018-10-19 23:21:18
176
原创 Linux下如何从用户态切换到内核态?
首先我们得明白什么是用户态和内核态?明白这两个概念之前,我们得知道用户空间和内核空间。用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等等;而内核空间则是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。不管对于Linux还是Windows, 他们都具有自己用户空间和内核空间。当一个程序运行时,如果它是在用户空间下执行,我们把此时运行得程序的这...
2018-10-18 19:39:10
20118
2
原创 排序算法2---希尔排序
希尔排序基本思想:希尔排序是插入排序的一个变种。不同之处在于我们按步长gap分组,对每组的记录采用直接插入排序,随着步长的逐渐减少,分组包含的记录越来越多,直到gap=1时,构成了一个有序记录。时间复杂度: O(n^1.25) ~ 1.6*O(n^1.25)空间复杂度: O(1)稳 定 性 :不稳定适用场景:数据量较大下图中为了方便,对gap以gap/2来计算,但最优的算法是gap/...
2018-10-17 15:25:03
309
原创 排序算法1--插入排序
插入排序思想:每一步将一个待排序的元素,按期排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,知道元素插完。插入排序分为直接插入排序,和优化后的插入排序,我们先看第一种;直接插入排序基本思想:当我们插入第 i (i&amp;gt;=1)个元素时,前面的所有元素已经排好序,此时我们使用当前元素从后向前比较,直到找到一个小于array[i]的节点(若没有,则插在数组下标为0的地方),,从下一...
2018-10-17 15:17:32
195
原创 C++---重载、重写(覆盖)、重定义(隐藏)
我们经常会被重载、重写、重定义经常被我搞混,今天就专门总结区别一下。1.重载重载概念:重载指的都是函数重载,函数重载就是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列 表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。构成重载的条件:函数名相同,参数列表必须不同(参数个数,类型,顺序),返回类型可以相同,也可以不相同。...
2018-10-16 23:58:33
1052
原创 csdn代码区的代码不变颜色?
可能有的小伙伴跟我一样遇到写csdn时代码区的代码是不变颜色的问题,今天刚好找到了一个方法分享给大家。1.例如这样,代码不变颜色,很不舒服我们只要给代码前加上相应的语言(如c,java等),注意要加在三个点之后,这个问题就解决了。不信你看;是不是很神奇,我也是刚发现。另外如果觉得代码的颜色的风格不好看的话,还可以去主页设置。这样就可以在博客设置里面可以设置博客皮肤和代码片颜色。希望能...
2018-10-11 12:22:53
5816
13
原创 C++多态调用实现原理(虚函数表详解)
1.带有虚函数的对象模型我们先看段代码:#include&amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;amp;gt;using namespace std;class B1{ public: void func1() {} int _b;};class B2{ public: virtual void func()
2018-10-11 11:42:22
4694
2
原创 RTTI---dynamic_cast
什么是RTTI?RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。RTTI提供了以下两个非常有用的操作符:(1)typeid操作符,返回指针和引用所指的实际类型。(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。typeid函数该函...
2018-09-25 22:05:09
1055
原创 C++第二大特性---继承
什么是继承?继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。简单地说,继承就是对代码的复用。继承权限&amp;amp;amp;amp;amp;amp;访问限定符继承的方式共有public、protected、private三种方式,不同的继承方...
2018-09-19 18:11:15
1569
原创 Linux---创建进程(fork和vfork的区别)
fork函数首先来看下函数原型:#include &amp;amp;amp;lt;unistd.h&amp;amp;amp;gt; //头文件 pid_t fork(void); //返回值:成功时父进程返回子进程的id,子进程返回0;失败时父进程返回-1我们可以用一段程序来测试fork函数的特点#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include&
2018-08-28 16:10:20
2320
原创 逆波兰表达式(后缀表达式)--栈的应用
1.什么是逆波兰表达式逆波兰表达式就是将操作符放置在两个操作数的后面,而通常我们所写的表达式都是中缀表达式,因此,逆波兰表达式也叫后缀表达式。看个例子就明白了。中缀表达式 12*(3+4)-6+8/2后缀表达式 12 3 4 + * 6 - 8 2 / +2.如何实现主要思路就是栈的Push和Pop操作,具体看下图; 3.代码具体操作...
2018-04-25 22:16:15
1263
原创 数据结构---单链表面试题
1.逆序打印单链表void PrintSListFromTail2Head(PNode pHead)// 逆序打印单链表 { PNode pCur = pHead; PNode pRet = NULL; if (pHead == NULL) return; if (pCur->p_next) { Print...
2018-04-21 18:22:37
347
原创 链表的相关操作
头文件声明SList.h#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;typedef struct SList{ DataType data; struct SList *p_next;}SList,*PNode;v...
2018-04-16 14:34:08
690
原创 数据结构---动态顺序表的相关操作
代码如下:List.h#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;assert.h&amp;gt;typedef int DataType;typedef struct SeqListD{ DataType *arr; //顺序表头指针
2018-04-13 15:03:39
276
原创 数据结构中算法的复杂度问题
算法的复杂度分为时间复杂度和空间复杂度1.时间复杂度其实,时间复杂度实际上就是一个函数,这个函数呢,它计算的是一个算法执行基本操作的次数。 这里,要明确,为什么不直接用时间来衡量一个算法的优劣,其原因在于一个算法在一个平台上运行时,可能会受到其他因素的影响,比如相同的两个机器在运行一个和多个进程时,其响应速度就会不一样,如果让它们共同运行一个算法程序,那消耗的时间也可能不...
2018-04-08 19:01:41
387
转载 CSDN-markdown编辑器使用方法
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I...
2018-04-08 18:11:38
369
原创 静态顺序表的相关操作
话不多说,直接看代码;SeqList.h文件 #include<stdio.h>typedef int DataType;#define MAX_SIZE 10 typedef struct SeqList{ DataType _array[MAX_SIZE]; int _size; // 表示顺序表中有效元素的个数 }SeqList, *PSeq...
2018-04-08 15:49:18
187
原创 左旋字符
问题描述:实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA , ABCD左旋两个字符得到CDAB 。 该问题有三种解法:1. 第一种方法是通过左移字符串,例如当左旋2个字符时,可以先左旋一个字符,要左旋一个字符,可以先将第二个以及它后面的全部字符全部向左移动一位,之后再将之前的第一个字符赋值给最后一个字符,但再赋值之前要先保存第一个字符;之后要左...
2018-03-24 21:59:50
323
原创 C语言中结构体大小的计算(内存对齐详解)
首先来看一个例子;struct S{ char a; int b; char c;};我们先来计算一下这个结构体的大小,如果不存在内存对齐这个问题,按理说这个结构体应该占(1+4+1)6个字节;然而事实上它占了12个字节,为什么?我们需要解决下面几个问题。1.为什么存在内存对齐平台原因(移植问题):一些资料上是这样说的,“不是所有的硬件平台都能...
2018-03-24 17:13:04
10144
6
原创 C语言操作符(总结)
操作符 分类: 算术操作符 移位操作符 位操作符 赋值操作符 复合赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员算术操作符 操作符 功能...
2018-03-24 14:40:48
2639
原创 自我介绍及学习规划
1.大家好,我来自西安工业大学计算机科学与技术专业19班,对于编程,我还是蛮感兴趣的,我很喜欢和一些志同道合的人去谈论,去研究一些我们感兴趣的东西,不论是学习还是娱乐都是如此。我觉得编程是一件挺有意思的事情,如果把生活中的一些小问题用代码的思想考虑它,其实还挺有趣的。2.我的编程目标很简单,每当自己想要通过编程解决一个问题,或实现一个东西的功能时,我都能通过自己debug,得心应...
2017-11-12 16:19:10
1910
原创 怎样正确求两个数的平均值?
1.先来看一个例子:int main(){ int a,b,aver; scanf(&quot;%d %d&quot;,&amp;amp;a,&amp;amp;b); aver=(a+b)/2; printf(&quot;%d&quot;,aver); return 0;}写出这个程序后,大家可能会说这个程序输出的平均值不准确,小数
2017-11-07 00:32:33
6858
2
原创 模拟实现string类
#includeusing namespace std;#includeclass String{private:char *ptr;public:String(const char *s=""):ptr(new char[strlen(s) + 1]) //1.为什么要初始化列表,而没有写进函数里面{strcpy(ptr, s);}Stri
2017-07-06 23:34:41
317
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人