- 博客(87)
- 问答 (16)
- 收藏
- 关注
原创 Linux线程的操作以及与进程的区别
线程的感念 Linux中不仅有进程这一概念,还有线程这一概念。简单来说,线程是指:在一个进程中,不同的执行流。线程的大部分概念和进程相似,所以他们有很大的相同之处。多线程之间的切换和调度就好像进程间的切换和调度一样,他们都在进程的地址空间运行,所以多线程之间可共享一些资源: 1、文件描述符表; 2、每种信号的处理方式; 3、当前工作目录; 4、用户id和组id; 但是
2017-06-15 15:34:29
745
原创 Linux进程通信之共享内存
基于system V版本的进程间通信还有最后一种方式,那就是共享内存。 共享内存的最大的特点就是:它是基于system V 的通信方式中速度最快的一个,这是因为共享内存不经过页表的多次转化,和多次映射,这就节省了很多资源,试问:每次通信时都要把内存上的东西映射一遍,那么这浪费的时间就不是一点半点了。他只是在创建的时候将共享内存的物理地址映射到进程的虚拟地址空间里,之后每次操作都会直接对这块空
2017-06-14 15:26:07
577
原创 Linux进程通信之二元信号量
信号量的概念: Linux中,基于system V的进程间通信还有二元信号量的通信方式,但严格意义上来说,信号量并不具备数据交换的功能,它本质是一把数据操作锁。通过控制其他的通信资源(⽂件,外部设备)来实现进程间通信,它本⾝只是⼀种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。一、为什么要使⽤信号量 为了防⽌出现因多个程序同时访问⼀个共享资源⽽引发的⼀系列问题,我们需要⼀种⽅法
2017-06-13 17:54:36
5029
原创 Linux进程通信之消息队列的双向通信
上一篇博客我写了进程间通信基于管道的通信,但是管道的通信无疑有很大的缺点,最显著的就是只能单向通信,例如:server向client发消息,client无法回复;第二个就是只能在有血缘关系的进程间进行通信,虽然命名管道解决了第二点,但是第一点还是一个很大的问题。开个玩笑:微信如果只能单向通信的话,你还会用吗?我估计发个消息能难受死你。 所以,这就是接下来几种进程间通信的产生条件。消息队列、信号
2017-06-12 16:05:36
3957
2
原创 Linux进程通信之管道(匿名,命名)
进程间通信产生的条件: 每个进程各⾃自有不同的⽤用户地址空间,任何⼀一个进程的全局变量在另⼀一个进程中都看不到 所以进 程之间要交换数据必须通过内核,在内核中开辟⼀一块缓冲区,进程1把数据从⽤用户空间 拷到内核缓 冲区,进程2再从内核缓冲区把数据读⾛走,内核提供的这种机制称为进程间通信 (IPC,InterProcess Com) 管道就是进程间通信最基本的一种通信方式。 管道是
2017-06-10 12:38:52
653
原创 Linux shell的模拟,并实现输出重定向
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <pwd.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int main(){ cha
2017-05-22 11:42:57
1411
原创 AVL(平衡)树的旋转
在二叉搜索树中,可能会存在几种特别的情况,即左单支、右单支之类的情况,这样的情况在二叉搜索树中查询某个节点代表的内容时,依旧会达到O(N)的时间复杂度,而不能按预期达到O(lgN)的时间复杂度。 所以在树中旋转树的结构,将树调整为一个满足条件的树–AVLTree(平衡树),即右子树的高度减去左子树的高度的绝对值小于2。为了达到AVL树,有四种基本情况,所以对应四种旋转方式,左单旋,右单旋,右左
2017-05-21 21:38:17
691
原创 Linux之file_struct&fd(file descriptor)
Linux中每个进程会产生一个PCB(Process Control Block)进程控制块,既然是一个进程,那么就会在这个进程中对文件进行操作,所以每个PCB中会对应生成一个struct file(文件描述符表),直观的看。每个位置都对应一个指针指向目标文件。这个位置使用open函数来确定的。open函数 open函数的原型为: int open(const char *
2017-05-11 10:23:32
853
转载 Linux下的重定向
linux中使用重定向符号可以实现输出输入重定向,默认条件下,标准输出和错误输出都是终端,用重定向符号可以把标准输出和错误内容进行重定向,例如把标准输出重定向到文件,看下面的详细解释输出重定向: 默认条件下,标准输出和错误输出都是终端,可以把标准输出和错误内容进行重定向: 复制代码 代码如下:[~]# echo “hello!” hello! [~]# echo “hello!” -
2017-05-07 18:27:20
290
原创 线索二叉树的前、中、后序创建和遍历
#pragma once#include <iostream>#include <string>using namespace std;enum NodeFlag { LINK, THREAD };template <typename T>struct BinaryTreeNodeThd{ BinaryTreeNodeThd(const T& data) : _data(
2017-05-07 13:29:32
510
1
原创 二叉树的实现及相关函数的实现
#include <iostream>#include <queue>#include <stack>using namespace std;template<typename T>struct BinaryNode //__默认构造函数__{ BinaryNode() : _pData(0) , _pLeftChild(NULL) , _pRightCh
2017-05-04 20:55:58
866
原创 atexit——注册函数
atexit()名为注册函数,他的使用也很简单。 即:在main函数结束之前调用atexit(函数指针)参数中的函数。 那么,main函数中注册多个atexit函数,会全部执行吗?会全部执行的话,执行的顺序是什么呢? 为此,我使用了下面这些代码验证: #include <stdio.h>void fun1(){ printf("this is fun1 functi
2017-04-25 21:17:44
1194
原创 linux之僵尸进程、孤儿进程
僵尸进程即为进程已经执行完毕,但是其父进程没有调用wait/waitpid,则该进程将变成一个僵尸进程,虽然没有执行,但占用系统中的一个PCB空间。僵尸进程多的话,可以将系统卡死。 僵尸进程的实现为:使用folk创建一个子进程,让子进程进来之后很快就退出,父进程什么也不做,即没有调用wait/waitpid,所以该子进程就成为了一个僵尸进程。 int main(){ pit_t
2017-04-25 20:38:31
1283
原创 稀疏矩阵的访问、普通逆置和快速逆置、还原输出以及加法
首先稀疏矩阵的概念: 在一个矩阵中(并不要求为方阵)无效元素的个数远远大于有效元素的个数,我们称之为——稀疏矩阵。一般没有一个明确的界限分开稀疏矩阵和普通矩阵,不过一些人认为:有效元素的个数/无效元素的个数<0.05即可称之为稀疏矩阵。 跟对称矩阵压缩存储的逻辑相似:我们只需存储稀疏矩阵的有限元素就行,但有效元素的位置并没有什么规律,所以在存储时还要存储相应元素的行、列的下标。 可
2017-04-25 10:30:55
1105
原创 矩阵之对称矩阵的压缩存储及访问和还原
在矩阵层次上,有几个矩阵时很特殊的。这篇文章是主要讲述对称矩阵的压缩存储、访问和还原的。 首先,何为对称矩阵? 首先,对称矩阵是一个二维数组,也是一个方阵。它的行列对应的列列行的数据相等,即arr[i][j]==arr[j][i];如下: 那么我们在存储时还存储一个5*5的的二维数组是不是有点浪费空间了。既然存在arr[i][j]==arr[j][i]这个规律,何不妨只存储
2017-04-24 17:09:40
3367
原创 中缀表达式转后缀表达式并输出计算结果
后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。 但日常生活中我们总是习惯于写中缀表达式,所以需要先将中缀表达式转为后缀表达式。 假如中缀表达式为:12*(3+4)-6+8/2 在遇到数字时,我们直接输出,遇到符号,则入栈。但在入栈时,我们要判断栈内已有
2017-04-20 13:42:22
20494
8
原创 Linux的task_struct中的成员及代表意义
进程状态/调度数据成员(State) 这个信息中可细分为6中状态,分别为:TASK_RUNNING:处在这个状态的进程,不是在运行就是准备运行,只是等待运行本进程的资源到位。即准备运行的进程只要得到CPU就可以立即投入运行。进程中有一个运行队列run_queue,容纳所有可运行的进程,调度进程时,从中选择一个进程进行执行。当前运行进程一直处于该队列中。TASK_INTERRUPTIBLE:处于等待
2017-04-13 11:10:07
2170
原创 实现string类的几种方式
浅拷贝 浅拷贝的意思就是在拷贝构造函数、赋值运算符函数时并没有给新对象开辟一块空间,而是直接二者公用一块空间。这个问题就很麻烦了。 s1,s2共用一块空间,此时不论s1怎样修改,都会影响到s2,而且析构s1后,s2就无法继续使用。 简单代码实现如下: class String{public: String(char* pStr = "") {
2017-04-09 15:31:28
1633
原创 Linux下进度条的简单实现
逻辑 进度条实现的简单逻辑就是第一次输出一个字符,第二次输出两个字符…直到最后一直输出100个字符,但每次只显示一行,所以这就要明确一下“缓冲区”这个概念。 简单的谈一谈缓冲区,每次我们使用scanf和cin时,输入的东西都不值是直接输入到我们想要输入的内存空间,而是全部储存到了输入缓冲区的stdin,在我们输入完成之后,即敲击回车键之后,缓冲区输入完成,编译器就会从缓冲区上拿走当前变量
2017-04-05 20:46:16
683
转载 Linux终端彩色打印+终端进度条
原文链接:https://my.oschina.net/jcseg/blog/178047开发的一个应用程序选择了终端界面, 为了使软件稍微好看些, 研究下Linux终端的彩色打印, 并且基于这个彩色打印实现了几种进度条, 在此总结下: (更多的是觉得这个东西挺好玩的... )一. Linux终端色彩打印:1. 属性介绍: (1). 来自网络的ANSI属性控制码:
2017-04-05 17:51:19
6589
原创 四种智能指针的用法和原理
智能指针共分为4种,即boost库中的auto_ptr、scoped_ptr、shared_ptr、weak_ptr。 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。 操作的方法:在构造函数时,将类外需要管理的指针传进去,可以给个空的缺省值,然后重载“->”
2017-04-04 13:06:28
26737
3
原创 CentOs的Linux联网配置
首先切换成超级用户 su之后输入登陆密码 然后在主工作目录下:vim /etc/sysconfig/network-scripts/ifcfg-eth0 直接进入 修改里面的信息(按“i”进入插入模式):我的是这样的: DEVICE=”eth0” // 描述网卡对应的设备别名BOOTPROTO=”static” //启用静态IP地址IPADD=192.168.1.107 //设置IP地
2017-04-01 10:44:08
613
原创 Linux中的粘滞位的作用
在Linux中,有个“一切皆文件”的说法,而且每个“文件”都有自己的权限,但是有些时候这些权限起的作用有点让人琢磨不透,对文件的管理就会达不到条理的、合适的管理要求。最简单也是最典型的例子就是:创建一个目录,在这个目录里面创建一个普通文件,这个文件的权限默认情况下是664,即“rw-rw-r–”,表示other用户没有权限写入和执行,但是假如我们切换道另一个用户,然后rm即删除这个文件,会发现,在询
2017-03-26 13:35:58
849
原创 Linux中find的常用指令的用法及作用
Linux中find的指令尤为重要,所以我们要对find指令的一些常用指令进行了解以及熟练使用,这对Linux的使用有着至关方便的作用,学习完find的一些指令并会熟练使用时,你就会发现Linux这个平台上查找实在是太方便了,再或许,你可能会觉得相比Windows,操作起来实在是更显得更有范儿! 试试就知道了,以下的指令中如果没有确切说明,那么“<>”这对括号只是为了区分而使用的 1.>
2017-03-26 11:52:08
25845
原创 Linux下stat命令的Access、Modify、Change时间的含义
Linux下,我们通常使用“ls”、“ll”或他们家族的命令来查看一个文件的详细信息,但是有些人还是不满足,谁呢?我们的程序猿呗_qaq,可能一觉醒来发现程序挂了,崩溃了,光看“ll”下的数据可能不够(可能stat也不够,但是我目前只知道这么多了qaq), 所以stat一下这个程序,就能看见好多信息了。 当我们如此输入命令时: stat 文件名 就会显示这个文件的更多详细信息
2017-03-19 18:47:54
6878
原创 Linux权限的简单用法(使用者、文件、目录)
首先,我们需要知道Linux中的权限是十分重要的,而且权限分为两类:一类是使用者的权限,一类是文件以及目录的是否可读、写、执行的权限。 拥有者–所属组–other 首先很多人不明白这三个使用者的权限是什么意思。一般情况下,拥有者是这个文件的创建者,即哪个用户创建的这个文件。并且在创建新用户的时候会创建出一个同名的组,这个拥有者默认包含在这个所属组中。我们先来理一理这三者的联系去区别,对于初
2017-03-19 14:05:42
5213
转载 解决linux下sudo更改文件权限报错xxxis not in the sudoers file. This incident will be reported.
本文转自Linux社区作者为z-sm的文章原文链接http://www.linuxidc.com/Linux/2016-07/133066.htmLinux中普通用户用sudo执行命令时报”xxx is not in the sudoers file.This incident will be reported”错误,解决方法就是在/etc/sudoers文件里给该用户添加权限。如下:1.切换到
2017-03-17 21:11:06
163162
9
原创 模板类模拟实现List
上一篇中我模拟实现了vector,接着这个当然就是list了,首先对于list,在库函数里面,list是一个双向的,即既含有next域,也含有prev域,每个节点都含有这样的结构,我们在写的时候要把一个一个链接上,而且要保证逻辑正确,作者本人就在拷贝构造函数的时候懵逼了半天。所以一个表示节点的结构体必须有,这个当然也可以用类,但是你会感觉本质上你还是用类中结构体的性质,所以还是结构体方便一点。
2017-03-16 09:57:07
1299
原创 用C++的类完成玩骰子的游戏
我们生活中随处可见的玩骰子游戏,那么我们用C++的类实现出来时会是怎么样呢? 首先,是得到一个1-6之间随机数的写法 Random.h#ifndef RANDOM__H__#define RANDOM__H__using namespace std;#include <cstdlib>#include <ctime>class Random{public: Random();
2017-03-14 10:45:03
2531
原创 如何创建对象的数组
创建对象我们都很熟悉,但是创建对象的数组(也就是相当于创建一个“int”类型的数组,而这个的元素是一个一个的对象)呢?可能在看到我解释的那么多后,你觉得应该是一个道理,但是事实上真的是如此吗? 假如我们按这种方法创建,看看编译器怎么说: int main(){ int const dimension = 10; string* pStr = new string[dim
2017-03-12 15:47:37
4097
原创 模板类实现顺序表
#include <iostream>using namespace std;template<class T>class Vector{ //定义几个类型,以便于管理public: typedef T ValueType; typedef ValueType* Pointer; typedef const ValueType* ConstPointer;
2017-03-12 13:28:58
622
原创 模板函数的使用
1. 模板的简单介绍 我们已经写过有C语言版、C++版的顺序表了。但是这只是对单一的确定的类型起作用的方法,但是对于我们想使用一个顺序表,但不用在任何时候都去编写一个专属于这个类型的文件,无论是C或者C++,那么我们怎么办呢? 运气的是,在C++的编译器里给我们提供了“模板”这个东西,使得代码复用率提高,使我们可以不用为了表示某一种类型就去专门编写一个专属此类型的文件。而且,如果去看C++里面的
2017-03-11 14:02:43
1096
原创 浅谈C++“多态”的一些现象
多态的概念 多态:一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++语言中多态有着更广泛的含义。静态多态 编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。 就像一个同样逻辑的加法函数,但是类型不一样,我们在使用时编译器自己就会识别到底应该使用哪个函数。例如如下代码:int Add(
2017-03-07 21:43:27
413
原创 C++版双链表的实现
#define _CRT_SECURE_NO_WARNINGS#include using namespace std;#pragma oncetypedef int DataType;struct Node{ Node(const DataType& data = 0) : _data(data) , _pNext(NULL) , _pPre(NULL) {}
2017-03-02 21:44:33
317
原创 C++ 的 “继承”
首先,“继承”二字,可以用生活中的例子来理解,即:继承上一版本的功能,并继续发展下一版本的功能。它在C++里面可以使面向对象的程序设计代码复用,从而使C++更贴合面向对象这个方向。继承的概念: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程
2017-03-01 17:40:40
385
原创 C++模板类实现顺序表
#define _CRT_SECURE_NO_WARNINGS#include using namespace std;#include #define length 10typedef int DataType;class Vector{public: // 构造函数 explicit Vector(size_t capacity = 100) //若不给
2017-02-26 22:08:36
406
原创 顺序表的实现
#define _CRT_SECURE_NO_WARNING#include #include #include #define max 100typedef int DataType;typedef struct SeqList{ DataType *arr; int size; }SeqList;void InitSeqList(SeqList* seq)
2017-02-18 21:28:44
307
原创 单链表
#define _CRT_SECURE_NO_WARNINGS#include #include #include typedef int DataType;typedef struct Node{ struct Node* next; DataType data;}Node, *PNode;void InitList(PNode* pHead){ *pHead =
2017-02-18 21:27:20
338
原创 c++复数类的实现
复数是一个数学中很重要的东西,下面是我用c++实现的复数的类#define _CRT_SECURE_NO_WARNINGS#include using namespace std;#include class Plural{public: Plural(int real = 0, int image = 0) // 构造函数 : _real(real) , _
2017-02-18 21:20:13
771
空空如也
为什么我的vim进入后没有使用SetTitle函数?
2017-04-04
我就想知道为什么我的vim中这样的文件出不来头文件和版权信息?
2017-04-04
读取文件并写入二维数组
2017-04-20
关于C++中含派生类自身独有的虚函数的类模型?
2017-04-08
定位放置new开辟出的对象的空间在哪?
2017-03-12
返回值和形参均为引用时为什么形参不能后置++?
2017-03-05
C++双向链表的“[]”的重载
2017-03-01
c++中实现string类的问题
2017-02-22
模板类实现顺序表之析构函数
2017-02-25
关于VS2013的运行时间
2017-02-22
为什么文件老是打不开?
2016-12-19
结构体内元素的赋值问题
2016-12-11
结构体中字符型数组为什么用strcmp时与预期结果不符?
2016-12-08
结构体元素的赋值问题
2016-12-08
关于结构体的箭头操作符
2016-12-04
关于数组和前一逻辑求出的值
2016-10-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人