自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程间通讯(IPC)(1)———管道

提出疑问每个进程有自己独立的用户地址空间,一个进程的全局变量在另一个进程中可以看到吗?我们用下面这个程序来进行测试:验证结果:可以看出:在父进程中的全局变量,如果在子进程中去改变这个全局变量,则子进程中被改变的这个值不会去影响父进程,因为子进程中的所有数据都是通过写时拷贝拷自父进程的,这两个进程的地址空间就是不同的了。进程间通信概念:进程用户空间是相互独立的,一般而言是...

2019-08-18 21:13:10 185

原创 C语言中的#和##表示的意义

前两天看到另外这么一道面试题:C语言中的#和##是用来干什么的?通过查资料今天给大家说一下:首先,我们平常在C语言中写的‘#’就是将其后面的宏参数变成一个字符串,而‘##’是将两个宏参数粘合在一起。具体使用看下面:#include <iostream>#include <stdio.h>using namespace std; #define Fin(...

2019-08-13 00:35:45 4784

原创 fork()函数详解以及进程创建的过程

进程控制块(PCB):用来标识一个进程的,它包含了该进程的各个信息。它是task_struct这个结构体。那这个task_struct结构体是怎样在内核中存在的呢?接下来我来说一下。内核在为每一个进程分配PCB的时候,实际上是分配了两个连续的物理页面(共8K),这两个页面的底部1K空间用作进程的PCB结构,剩余7K就是这个进程的系统空间堆栈了,如图:内核把进程的列表存放在任务队列的...

2019-08-02 17:51:35 1658

原创 Linux下的强大工具gdb的使用(详细)

首先先说一下gdb是什么东西?gdb是GNU开源组织发布的一个强大的UNIX下的程序调试工具。一般来说,gdb主要帮忙你完成下面四个方面的功能:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所设置指定的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时你的程序中所发生的事。动态的改变你程序的执行环境。让我们在了解两个版本:De...

2019-08-02 15:09:36 1302

原创 Linux中主函数的参数和缓冲区的理解

Linux中的主函数如下所示:int main(int argc,char*argv[ ],char *envp[ ]);argc:是传递的参数列表中参数的个数。argv[ ]:是传递的参数列表。envp[ ]:是环境变量。#include <stdio.h>#include <stdlib.h>#include <unistd.h>...

2019-08-01 20:06:12 148

原创 Linux中的库函数与系统调用函数详解

库函数:是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用函数:通常是用于底层文件的访问,由用户态进行调用,但是在内核态执行。系统调用函数和库函数的区别:1.从程序完成的功能来看:函数库提供的函数通常是不需要操作系统的服务. 函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到内核态的。而系统调用是要求操作系统为用户...

2019-08-01 19:17:41 689

原创 Linux下的用户态到内核态的切换

对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86架构的cpu一共有四个级别,0-3级,0级特权级最高(内核态),3级特权级最低(用户...

2019-08-01 16:39:04 461

原创 静态库和动态库的区别(面试题)

目前以lib为后缀的库有两种,一种为静态链接库,另一种则为动态连接库的导入库。则他们的区别如下:静态库静态函数库的扩展名一般为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib 。这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件体积会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,代码装载效率高,移植比较方便,而不再需...

2019-08-01 14:59:32 2214 1

原创 详解软链接和硬链接的区别

软链接:又称符号链接,文件用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。软链接可对文件或目录创建。 软链接主要应用于以下两个方面:一是方便管理,例如可以把一个复杂路径下的文件链接到一个简单路径下方便用户访问;另一方面就是解决文件系统磁盘空间不足的情况。例如某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那...

2019-08-01 14:18:42 505

原创 线程和进程的区别

线程和进程的区别:线程共享创建线程的进程的地址空间,而进程有各自独立的地址空间; 线程可以直接访问他进程中的数据段,而进程直接从父进程继承数据段,有数据段的拷贝; 线程可以和他进程中的其他线程直接进行通信,进程必须使用进程间通信与同胞进程进行通信; 线程几乎没有开销,而进程有相当可观的开销; 容易创建新的线程,而进程需要父进程的复制; 线程可...

2019-08-01 02:06:39 116

原创 Linux下的Makefile的使用(完整)

Makefile,是不是很多Windows下的编程人员没有听说过这个东西,因为那些Windows的IDE都为你做了这个工作。下面我来谈论一下linux下的Makefile的使用。在linux下,makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,你可以在makefile文件中可以定义一系列的规则来指定,哪些文件需要先编译,哪些文...

2019-08-01 00:49:19 309

原创 操作系统对进程的管理方式、僵尸进程和孤儿进程

我们在上篇博客中提到了进程的概念,进程是运行中的程序(磁盘上的二进制文件)。今天我们来谈一下操作系统对进程的管理方式。进程控制块(PCB):用来标识一个进程的,它包含了该进程的各个信息。它是task_struct这个结构体。进程的控制符:全称为Process Identifier,就是标识进程唯一的身份标识,所以也成为进程标识符。进程控制符有pid和ppid两种,pid表示进程的id,...

2019-07-31 21:38:05 249

原创 linux中的ps命令和top命令的详细区别(完整)

众所周知,在Linux系统中ps和top命令都是用来查看进程信息的。但是他们具体有什么区别呢,接下来我们详细谈一下:ps命令只看到的是命令执行瞬间的进程信息,而top可以持续的监视。ps只是查看进程,而top还可以监视系统性能,如平均负载,cpu和内存的消耗。另外top还可以操作进程,如改变优先级(命令r)和关闭进程(命令k)ps主要是查看进程的,关注点在于查看需要查看的进程。...

2019-07-31 20:03:44 4733

原创 Linux上的有关进程管理的命令

在看命令之前,我们先看一下有关进程的概念:进程:运行中的程序(是一个动态的过程概念)执行时,将程序加载到内存上。 程序:存储在磁盘上的可执行的二进制文件。进程的执行方式:时间片轮转法:CPU的执行时间划分为很小的时间片,每个进程在CPU上运行,一次只分配一个时间片。在Linux系统上,/proc虚拟目录,以内存为单位存储内存映射。操作系统为了唯一标识一个进程,会给...

2019-07-31 19:53:26 515

原创 (Linux)文本编译器命令模式下的一些操作(光标的移动)+文件的打包和压缩操作

首先,让我们先输入vi/vim进入文本编译器中,在命令模式下,光标的移动命令操作如下:shift+4 :将光标移到本行最后一个位置shift+6 :将光标移到本行第一个位置gg:将光标移到本文件第一行G / shift+g:将光标移到最后一行行号n+shift+g(G):将光标移到第n行如果出现文本过长的情况,一页不能显示完全,可使用以下方法对该页内容进行操作:①s...

2019-07-31 18:35:50 401

原创 Linux下的文件操作命令(最详细)

Linux下的文件操作命令,接下来我们分普通文件和目录文件来进行讨论:1. 创建文件:普通文件:touch Filename(需要带上扩展名)例如:touch main.c目录文件:mkdir Firname(不需要扩展名)例如:mkdir Gaorutao2.删除文件:普通文件:rm Filename例如:rm main.c目录文件:rmdir Gaoruta...

2019-07-31 18:17:00 606 1

原创 Linux的目录文件以及文件的操作

Linux和Windows都是操作系统,不同之处在于Linux是基于命令行的OS,Windows是基于图形化界面的OS,在Linux上一切皆文件。在linux下文件类型可以分为:普通文件、目录文件、管道文件、链接文件、设备文件。接下来讲一下lInux的目录。/home:普通用户的家目录,每个用户都会在/home下有一个同名目录/bin:命令对应的可执行文件/etc:配置目录 ...

2019-07-31 15:23:43 253

原创 Linux基础与命令大全(完整版)

首先,先介绍一下什么是Linux?和Windows操作系统软件一样,Linux也是一个操作系统软件。但是和Windows不同的是,Linux是一套开放源代码程序的、并可以自由传播的类Unix操作系统软件(Unix系统是Linux系统的前身,具备很多优秀特性)。其在设计之初,就是基于Intel x86系列CPU架构的计算机的。它是一个基于POSIX的多用户、多任务并且支持多线程和多CPU的操作系...

2019-07-31 14:50:58 2723 2

原创 顺序表的基本操作(详细、全面)

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。接下来看一下顺序表的基本操作:...

2019-07-30 00:27:31 3051

原创 区分C++中同名函数的三种关系(重载、重定义、重写)

1.重载重载:就是同一作用域内被声明的几个具有不同参数列表(参数类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。class A{public:void Swap(int *a,int *b);int Swap(long *a,long *b);void Swap(double *a,double *b);void Swap(char ...

2019-07-29 20:48:50 1641

原创 C++中的inline函数、static函数、宏和普通函数的详细区别

首先先看一下什么是inline函数?inline (内联函数):是在函数调用点将函数代码进行展开。其实吧,这里的展开就是给编译器的一个建议,建议编译器将内联函数展开,具体会不会展开,还是要看编译器的处理,比如说如果我们在内联函数中出现了递归的使用,这样的话,编译器就不会进行将它展开,因为编译器只是进行词法,语法,语义分析,并不知道程序在运行的时候会进行递归多少层。在编译期间,复制代码到函...

2019-07-29 19:36:11 809

原创 详谈C++中的引用和指针的区别

先来谈一下C++中的引用:在C++中,引用就是引入了一个对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名而已,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。引用的特点:①一个变量可取多个别名。②引用必须初始化。③引用只能在初始化的时...

2019-07-28 16:33:34 109

原创 浅谈C++中的class与struct的区别

在这两年的面试题中,这个问题经常会被面试官问:今天就来简单的谈一下:C++中的class与struct的区别:struct是一个值类型,而class是一个对象类型; struct的默认访问权限为public,而class的默认访问权限为private; struct是没有继承的,也没有封装,要说封装只有初步封装。而class可以把数据、接口以三种类型(public、private、pr...

2019-07-28 15:00:34 422

原创 最详细的new和malloc的区别

这个问题是面试官进场问及到的。今天我就来给大家总结一下他们的区别。1.申请的内存所在位置:new操作符是从自由存储区为对象动态的分配内存空间,而malloc函数是在堆上动态分配内存。2.返回类型的安全性:new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象所匹配,不需要进行类型转化,所以new是符合类型安全性的操作符,而malloc内存进行分配是成功则返回void*,需要通过...

2019-07-27 23:07:09 221

原创 deleete和delete[]的具体区别

在C++中呢,用new申请的内存空间,它的释放方式有 delete 和 delete[] 两种方式,那么这两种方式到底有什么区别呢?今天我们就谈一下:前几天呢,我在书上看见过这样的内容:delete 释放new分配的单个对象指针指向的内存delete[] 释放new分配的对象数组指针指向的内存对于这两句话的理解,我们来分析一下底下的代码,就知道了。int *p=new int [...

2019-07-27 23:04:46 910

原创 最详细的堆和栈的区别

这个问题,经常会被面试官问到,所以我总结了一下堆和栈的区别,我是从8个方面进行对其分析:1.管理方式:栈是由编译器进行管理的,而堆是由程序员自己对其管理的,使用比较方便,但是容易产生内存泄漏。2.生长方向:栈是由高地址向低地址方向生长,是一段连续的内存区域,而堆是由低地址向高地址方向生长,是一段不连续的内存区域,是由链表进行对其遍历的。3.空间大小:栈顶地址和栈的最大容量由系统预先规定...

2019-07-26 21:14:15 447

原创 Linux下的虚拟地址空间布局图

在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么...

2019-07-26 18:41:56 503

原创 浅谈Linux中的fork和vfork的区别

业界的各位同行都知道,fork函数和vfork函数都是进行创建一个进程的。但是呢,各位知道它们之间有什么区别吗?接下来就让我给大家阐述一下: 我总结了一下几个区别:fork()创建的子进程拷贝了父进程的代码段,数据段,堆栈;而vfork()创建出来的子进程和父进程共享数据段; fork()创建的子进程执行次数不确定,操作系统对他们进行交替执行,而vfork()创建出来的必须要保证子进...

2019-07-25 16:59:20 214

原创 浅谈C++中的堆栈调用

一、在讲函数的堆栈调用之前,让我们先了解两个概念: 1.什么是栈以及栈的特点? 栈被定义为一个特殊的容器,用户可以将数据压入栈中,也可以将已经压栈的数据进行出栈;压栈操作使得栈增大,出栈使得栈减小;栈总是自下增长的,由高地址向低地址进行增长,栈顶指针由称为esp的寄存器进行定位,而栈底指针由称为ebp的寄存器进行定位(栈底指针不进行移动),压栈操作使得栈顶指针的地址减小...

2019-07-24 19:47:22 977

原创 回溯法经典算法 求集合中所有的子集

今天我们来看一下子集的问题。题目描述:给定一个任意集合A,集合的长度为Length,让你打印出这个集合中所包含的所有子集。题目分析:此问题实际上也是一个遍历树的问题,进行遍历每一个子元素,再进入下层函数时候记录上层结果,加入到下层函数中,再存储起来。其实总结器来他就是一颗完全二叉树。以下我们结合图来具体的说一下:我们以集合{1,2,3}来对此画树状图理解一下。图如下:以此我们可...

2019-07-24 16:37:06 4821 3

原创 详解全排列算法的递归实现

全排列算法现在在很多的程序中需要使用,而且也是一个非常重要且常见的算法,其实全排列算法是一种非常典型的递归算法。接下来我就用我所理解的全排列递归算法给大家讲一下:这样的算法的得到基于下面的分析思路。 给定一个具有N个元素的集合(N>=1),然后要求输出这个集合中各个元素的全部可能的排列。其中排列的可能性为N!种。递归算法实现: 比如,我们假设集合是{A,B,C...

2019-07-23 21:53:06 2020 3

原创 C++程序编译链接的详细过程

众所周知,我们写的程序需要可以成功运行,只要运行出来就是王道。那屏幕前的你知道我们的程序是具体怎样运行出来的吗?我想你应该不是你很清楚吧。接下来我给大家具体讲一下哦,小伙伴们赶紧收藏哦,小心以后又忘记了。找不到了。 我们的程序要运行起来呢,它需要四个步骤,即:预处理阶段→编译阶段→汇编阶段→链接阶段,最后生成我们所需要的可执行程序(Windows下是a.exe文...

2019-07-22 12:23:44 1005

原创 C++的初始化列表与常对象

一.初始化列表构造函数的初始化列表 ‘:’来指明成员的初始化方式构造函数内部都是赋值CLink(): a(20) //(int a = 20 初始化a){b = 30; //赋值}笔试题:以下这段代码 初始化列表中的执行顺序问题(1)Test (int a,int b):ma(a),mb(ma){}void Show (...

2018-12-05 17:30:43 467

原创 C语言和C++中const的区别

1、 c语言中的const#include<stdio.h>void main(){ const int a = 10; //int arr[a] = { 0 }; 不能用a作为数组下标 ...

2018-12-04 20:29:55 513

原创 C++中的关键字new和delete

指针常与堆(heap)空间的分配有关。堆就是指一块内存区域,它允许程序在运行时以指针的方式从其中申请一定数量的存储单元(其他存储空间的分配是在编译时完成的),用于数据的处理。堆内存也称为动态内存。C语言的方法:1. #include <stdlib.h>2. int *p= (int *) malloc(sizeof(int));3 ....4....

2018-11-25 19:48:21 405

原创 浅谈C++中的类与封装性

类我们知道,在C语言中struct将所有成员都默认为public权限,这很不安全。因此C++引进了功能与struct相同但更安全的数据类型——类。说明: 1.类声明中的访问限定符没有先后次序,通常将private放在后面,将public放在前面,方便了解类的可访问接口。 2.同一个类中,访问限定符出现次数没有限制。 3.数据成员和成员函数都可以设置为pub...

2018-11-25 13:22:57 1045 1

原创 C语言中关键字const 的用法

今天给大家讲一下C语言中关于关键字const的在各种语法的使用。const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable)。1:修饰局部变量例如:1. const int n=5;2. int const n=5;这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变脸初始...

2018-05-04 22:44:53 388 1

原创 指针的加法

指针+1给定一个数组,数组指针+1可能表示为三种情况:1.加一个字节 :程序出错2.加整个数组:这个操作完全没意义。3.加一个单元格:一个单元格几个字节是根据定义的指针的类型来定的,例如char,指针加1就是一个字节,即一个单元格。总结:指针加法需要调整(加1单元格),调整的权重为指针去掉一个星号,然后求指针sizeof,例如 int*p; p+1为加4个字节=siz...

2018-04-08 15:37:20 1216

原创 关于父函数调用子函数涉及的传指针和解引用出现的一些问题

指针作为c语言的重点不在于它本身有多少的难度而是理解的程度问题。以下是我对指针简单的理解。1.首先,要对指针有一个正确的认识:指针==地址先看这个例题,总结出几个常用的变量,常量:int main(){int a = 10;int b = 20;int *p = &a; //整型地址变量存放整型地址值*p = 1...

2018-04-08 14:48:53 419

原创 C语言中关于数字的处理:"得到"与"丢弃"对应位置上的方法以及正序输出每一位数字和逆序输出每一位数字

今天我来讲解一下C语言中有关于于处理数字的一些问题,有“丢弃 “和“ 得到“对应位上的数字的方法,常常可以用来解决一些顺序输出每个数字,逆序输出每个数字,判断数字位数等问题。第一个问题:判断数字位数:即任意给出一个数字n,要求统计输出n的位数。 思路分析: 该问题的处理方法有两种,即”丢个位“与”丢高位“。”丢个位“即对n进行除以10操作,并将其赋值给下一次除以10操作的n...

2018-04-08 13:53:20 225

空空如也

空空如也

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

TA关注的人

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