自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Linux 网络编程(网络字节序、地址转换)

字节序字节序是指多字节数据的存储顺序,在设计计算机系统的时候,有两种处理内存中数据的方法:大端格式、小端格式。小端格式(Little-Endian):将低位字节数据存储在低地址。大端格式(Big-Endian):将高位字节数据存储在低地址。举个简单的例子,对于整形 0x12345678,它在大端格式和小端格式的系统中,分别如下图所示的方式存放:下面例子为确定主机的字节序:#i...

2019-01-30 16:42:15 999

转载 Linux系统编程(dup()和dup2())

作用:dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁。对比于 dup(), dup2...

2019-01-27 19:27:57 795

转载 Linux系统编程(文件操作)

文件描述符在 Linux 的世界里,一切设备皆文件。我们可以系统调用中 I/O 的函数(I:input,输入;O:output,输出),对文件进行相应的操作( open()、close()、write() 、read() 等)。打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识...

2019-01-27 17:31:14 698

转载 Linux系统编程(Linux系统调用)

系统调用概述这系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把...

2019-01-27 17:05:15 543

原创 Linux编译器安装Vscode

在Windows下用VS用了2年,在Linux下用了Vim半年,第一次安装Vscode,被虐的哭笑不得,写一篇博客来纪录纪录吧。1、安装步骤:1.1安装Ubuntu Make:sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-makesudo apt-get updatesudo apt-get install ubuntu-make...

2019-01-26 23:15:09 10177 4

翻译 二叉树前序中序后序非递归写法

#include <iostream>#include <stack>using namespace std;struct TreeNode{ char val; TreeNode *left; TreeNode *right; TreeNode(char x):val(x),left(NULL),right(N...

2019-01-25 00:41:19 109

原创 删除链表中重复的结点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...

2019-01-22 17:20:35 241

原创 链表中环的入口结点

题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路二:既然有环,那么我们自然会想到用两个指针,一个走的快,一个走的慢,这样肯定有重合的时候,这时候 快指针比慢指针多走了一个环 :第一步,找环中相汇点。分别用pNode1,pNode2指向链表头部,pNode1每次走一步,pNode2每次走二步,直到pNode1==pNode2找到在环中的相汇点。第...

2019-01-22 16:49:13 100

原创 C语言简单算法(二)

1、 删除下标为k的元素2、找出常用的数字3、丢失的数字4、将0放在数组最后5、找出数组的单个数字6、画三角形星星7、啤酒与饮料8、求最大公约数一、删除下标为k的元素删除下标为k的元素void deleteK(int arr[],int n,int k){ for(int i = k;i<n-1;i++) { arr[i] = arr[i+1]; }}...

2019-01-19 19:51:57 970

原创 KMP算法

代码:void prefix_table(char pattern[],int prefix[],int n){ prefix[0] = 0;//一个元素所以prefix[0] = 0 int len = 0; int i = 1;//第一个不用比较 while(i<n) { if(pattern[i]==pattern[len])//如果相等,公共前后缀+1 { ...

2019-01-19 16:07:35 136

原创 C语言简单小算法(第一篇)

十道简单算法题1、1-n阶乘之和2、获取二维数组每列最小的值3、求"1!+4!(2的平方)+9!(3的平方)+…+n的值4、数组对角线元素之和5、打印杨辉三角形6、猴子吃桃子问题7、计算单词的个数8、判断字母是否完全一样9、判断一个数是不是2的某次方10、判断一个数字是不是ugly number一、1-n阶乘之和1-n阶乘之和怎么算?1的阶乘是12的阶乘是123...

2019-01-18 19:15:48 1456 1

翻译 Linux系统编程(标准I/O缓冲区)

标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是它的缓冲。标准I/O提供了三种类型的缓冲:1、全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作。常规文件(如普通文本文件)通常是全缓冲的。2、行缓冲:当在输入和输出中遇到换行符时,标准I...

2019-01-13 23:11:35 279

翻译 Linux系统编程(有名信号量)

在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量。无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥。它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件。1)创建一个有名信号量所需头文件:#include <fcntl.h>#include <sys/stat.h>#inc...

2019-01-13 20:01:55 1667 1

翻译 Linux系统编程(无名信号量)

信号量概述信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。信号量主要用于进程或线程间的同步和互斥这两种典型情况。信号量用于互斥:信号量用...

2019-01-12 23:22:13 872

翻译 Linux系统编程(线程互斥锁)

为什么需要互斥锁?在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。下面我们用程序模拟一下这个过程,线程一需要打印“ hello ”,线程二需要打印“ world ”,不加任何处理的话,打印出来的内容会错乱:...

2019-01-12 22:06:11 645

翻译 Linux系统编程(线程的读写锁)

读写锁基本原理当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用...

2019-01-12 21:29:28 412

翻译 Redis缓存雪崩和穿透的解决方法

今天来分享一下Redis几道常见的面试题:如何解决缓存雪崩?如何解决缓存穿透?如何保证缓存与数据库双写时一致的问题?一、缓存雪崩1.1什么是缓存雪崩?回顾一下我们为什么要用缓存(Redis):现在有个问题,如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。在前面学习我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间...

2019-01-12 20:43:34 35781 10

翻译 Linux系统编程(线程私有数据)

在多线程程序中,经常要用全局变量来实现多个函数间的数据共享。由于数据空间是共享的,因此全局变量也为所有线程共有。测试代码如下:#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <stdlib.h>int key = 100; //全局变量 void...

2019-01-11 14:55:55 398

翻译 Linux系统编程(信号)

什么是信号?信号是 Linux 进程间通信的最古老的方式。信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断> ),处理完成后,再继续玩我的游戏。...

2019-01-10 23:56:37 133

翻译 Linux系统编程(进程间通信作用与方法介绍)

进程的特点:进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源(例如打开的文件描述符)。但是,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信。进程间通信的目的:1、数据传输:一个进程需要将它的数据发送给另一个进程。2、通知事件:一个进程需要向另一个或一组进程发送...

2019-01-10 22:47:21 277

翻译 Linux系统编程(共享内存)

概述共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。共享内存的特点:1)共享内存是进程间共享数据的一种最快的方法。一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。2)...

2019-01-10 22:34:32 196

翻译 Linux系统编程(消息队列)

概述消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下:1)消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。2)消息队列允许一个或多个进程向它写入或者读取消息。3)与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。4)每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的...

2019-01-10 21:41:44 389

翻译 Linux系统编程FIFO()

命名管道的概述无名管道,由于没有名字,只能用于亲缘关系的进程间通信多。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相...

2019-01-09 19:59:31 5114

翻译 Linux系统编程pipe()

管道的概述管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。无名管道有如下特点:1、半双工,数据在同一时刻只能在一个方向上流动。2、数据只能从管道的一端写入,从另一端读出。3、写入管道中的数据遵循先入先出的规则。4、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息...

2019-01-09 19:11:59 7119

翻译 Linux系统编程vfork()

头文件:#include <sys/types.h>#include <unistd.h>pid_t vfork(void);功能:vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。返回值:成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。失败:返回 -1。for...

2019-01-09 18:30:28 296

原创 Linux系统编程 fork()

头文件:#include <sys/types.h>#include <unistd.h>pid_t fork(void);功能:用于从一个已存在的进程中创建一个新进程,新进程称为子进程,原进程称为父进程。返回值:成功:子进程中返回 0,父进程中返回子进程 ID。pid_t,为无符号整型。失败:返回 -1。失败的两个主要原因是:1)当前的进程数已...

2019-01-09 18:08:56 228

原创 C++智能指针

智能指针的作用:智能指针托管对象,对象的释放就不用操心,让智能指针管理。智能指针要跟原对象一样,我们需要重载->和*号操作符。总结智能指针就是用栈对象编译器自动释放的原理:下面为智能指针的例子。#include <iostream>using namespace std;class Fun{public: int age; Fun(int age):a...

2019-01-08 19:51:14 130 1

原创 命令界面查看C++类内存布局

基本使用方法VS 编译器(这里使用的是:VS 2012)可以通过”开发人员命令提示“查看 C++ 类的内存布局,非常有用。#include <iostream>using namespace std;class Fun{public: virtual void show() { cout<<"hello,world"<<endl; }...

2019-01-08 19:10:41 1170

空空如也

空空如也

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

TA关注的人

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