自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Fireplusplus的博客

逆水行舟

  • 博客(176)
  • 收藏
  • 关注

原创 数据安全与虚拟网卡的应用

最近逛github偶然发现了自己之前写的一段创建tun网卡的c代码,才发现它孤零零的在那儿躺了很久,想着怎么不让它继续孤单下去,于是就有了现在这篇文章:30天用c实现一个代理,也算物尽其用了吧。

2021-01-31 23:24:30 421

原创 MySQL InnoDB存储引擎-事务篇

前言  说到数据库事务,想到的就是要么都做修改,要么都不做。或者是ACID的概念。其实事务的本质就是锁和并发和重做日志的结合体。那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的。原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability)一.隔离性隔离性的实现原理就是锁,因而隔离性也可以称为并发控制、锁等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离。再者,比如操作缓冲池中的 LRU

2020-12-27 14:53:54 203 2

原创 MySQL InnoDB存储引擎-锁篇

锁机制用于管理对共享资源的并发访问。InnodDB存储引擎中,会在数据库内部的多个地方使用锁,从而允许多种不同资源的并发访问。比如:操作缓冲池的LRU列表,删除、添加、移动LRU列表的元素,为了保证一致性,必须有锁的介入。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。InnoDB存储引擎锁的实现提供一致性的非锁定读、行级锁支持。行级锁没有额外的开销,并可以同时得到并发性和一致性。锁的类型行级锁InnoDB存储引擎实现了两种如下的行级锁:共享锁(S Loc

2020-11-28 16:17:04 232 1

原创 MySQL InnoDB存储引擎-索引篇

历时两个月,利用地铁上飞驰的时间,终于把《MySQL技术内幕 InnoDB存储引擎》这本书看完了。这本书通篇讲了比较多InnoDB存储引擎底层实现的逻辑,包括跟其它数据库厂商实现的对比,令我这样的初学者看起来还是比较头大的,但不妨碍其成为一本优秀的科普书。虽然最近一直加班一直爽,但还是利用晚上的碎片时间把一些比较重要的知识整理了下分享出来,写完之后还是感觉美滋滋的^_^。

2020-10-31 11:38:55 734 1

原创 linux下的动态库注入

前言最近在维护公司的一个服务X,服务X因为协议设计的不够安全,存在被攻击的风险,所以修改协议提升安全性就显得势在必行了。然鹅,该项目涉及到多个版本,将改动合入到各个版本引起的开发及测试工作量颇大,最终讨论后决定通过动态库注入的方式进行修改。何为动态库注入动态库注入是指在程序启动或运行的时候,通过某种手段加载另一套接口库,替换原有依赖库中的函数。这样可以达到改变程序功能而又不对原有代码进行修改的目的。如何做linux下有一个环境变量叫LD_PRELOAD,动态链接器在载入一个程序所需的所有

2020-10-14 23:13:56 1877 2

原创 HTTPS: 基于HTTP+SSL/TLS的安全通信协议

何为HTTPSHTTP(HyperText Transfer Protocol )是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTPS(HyperText Transfer Protocol over Secure Socket Layer),从其名字也可以看出,是在安全套接层之上的HTTP协议。其中的S可以理解为SSL/TLS协议,其中TLS又是SSL的改进版本。HTTPS的安全数据传输就依赖于SSL/TLS协议。为什么

2020-09-03 00:02:38 2803 1

原创 IPC的选择

常见的进程间通信方式大概有如下几种:管道、消息队列、共享内存、套接字。以前只是大概了解了这几种实现方式,但对于如何选择一种合适的通信方式一直没有清晰的认识,这几天抽空查阅了资料,顺便整理下。管道管道分命名管道与匿名管道,用作两个进程间通信,数据只能以字节流的方式单向传输,如果要双向通信,就得开两个管道。有关管道的详细介绍可以参考:https://blog.csdn.net/qq_33724710/article/details/52345509管道的可读性并不高(比如匿名管道一端关闭读,一端

2020-08-12 00:14:04 272 1

原创 Linux内存管理——内核内存管理

前言 linux内存管理可以分为两部分,内核内存管理,进程内存管理。由于一些条件的限制,比如内核分配内存时不能睡眠,不能像用户空间那样奢侈的使用内存,内核的内存分配与用户空间的内存分配是不太一样的,本文据此大概讨论下内存管理机制。页内核把页作为内存管理的基本单元,尽管cpu的最小可寻址单位为字节。内存管理单元(MMU)用页表对页进行管理,并且负责将物理内存映射为虚拟内存。一般体系结构不同,对应的页的大小也是不一样的,比如32为x86的环境,页的大小通常为4KB,64位体系结构一般支持8...

2020-06-27 11:40:27 397

原创 记第一次提交patch给开源项目的经历

近期由于工作的原因接触到了openldap的开源库,在一次偶然的代码review的情况下发现了一个内存泄漏的bug。对,不是测试发现的,是代码审核看出来的。问题代码该项目github源码路径为:https://github.com/openldap/openldap/blob/OPENLDAP_REL_ENG_2_4_49/libraries/liblunicode/ucstr.c为方...

2020-03-29 12:07:26 724 1

原创 centos下创建虚拟网卡

虚拟网卡Tun/Tap较高版本的linux大都自带了tun/tap 驱动程序用以实现虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。Tun/Tap驱动程序工作原理做为虚拟网卡驱...

2020-01-01 13:08:48 2851 1

原创 用python发微博

前言前不久萌生了学习下python的想法,于是乎本着练手的目的做了这么个发微博的小玩意。注册新浪weibo允许第三方以应用的方式发布微博,所以我们首先要做的就是通过新浪微博开放平台注册一个应用:weibo_open打开上述平台的页面,用微博账号登录,然后点立即接入开始注册自己的应用,按提示操作即可。如下是我自己创建好的应用,名为share.cn:app...

2019-08-11 15:21:47 1446 6

原创 IO多路转接之epoll

#include #include #include #include #include #include #include #include #include int start_up(char* ip, short port){ int listen_sock = socket(AF_INET, SOCK_STREAM, 0); if (listen_sock < 0

2016-09-27 13:40:48 518

原创 单例模式

设计模式是代码总结的经验,用来解决一类问题。单例类有两个特点:保证全局只有一个唯一实例提供了方便获取唯一实例的接口单例模式又分为懒汉模式和饿汉模式:(一般用在高并发环境下,所以保证线程安全并且高效很重要)懒汉模式:直到第一次调用接口才产生实例对象 // 懒加载,与COW思想一致,用到的时候才处理,提高效率class Singleton{public: static

2016-09-19 15:59:11 427

原创 从轮子造起——SGI-STL空间配置器

引言人们常说,不要从轮子重新造起,要站在巨人的肩膀上。面对扮演轮子角色的这些STL组件,我们是否有必要深究其设计原理或实现细节呢?答案因人而异。从应用的角度思考,你不需要探索实现细节(然而相当程度地认识底层实现,对实务运用有绝对的帮助)。从技术研究与本质提升的角度来看,深究细节可以让你彻底掌握一切:不是为了重温数据结构和算法,或是想要扮演轮子角色,或是想要进一步扩张别人的轮子,都可因此获得

2016-09-15 15:48:43 625 3

原创 TCP和UDP的区别

TCP和UDP都是TCP/IP协议簇中的协议,位于传输层,负责向两个主机中进程间的通信提供通用的数据传输服务。 传输控制协议TCP:提供面向连接的、可靠的数据传输服务,数据的传输单位是报文段。 用户数据报协议UDP:提供无连接的、尽最大努力的数据传输服务,数据传输的单位是用户数据报。TCP(Transmission Control Protocol,传输控制协议)是面向

2016-09-12 10:47:52 649

转载 多线程还是多进程的选择及区别

鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。 经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有

2016-09-12 09:10:37 7476

原创 漫谈-线程

线程概念我们都知道,进程拥有独立的地址空间,进程之间共享数据需要通过进程间通信机制来实现。然而进程是单一执行流的,有些时候需要在同一个进程中执行多个控制流程,这时候线程就派上了用场。比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实

2016-09-10 13:04:24 430 1

原创 Linux下的定时计划任务——crontab

cron是一个Linux下的守护进程,用来定期的执行一些任务。要让cron执行你指定的任务,首先就要编辑crontab文件。命令:crontab -e刚进去提示选取一个编辑器,随意选,我习惯里用vim在这里面就可以编写要周期性执行的任务了。格式是这样的:          每项工作就占一行,总共六个字段。此外,还有一些辅助字符:          简单做个测试:

2016-09-09 17:16:00 415

原创 聊天室

实现一个基于udp协议的网络群聊系统,可以完成多人的实时信息交互任务。其实就是类似于实现qq的群聊。系统环境Ubuntu 编辑器:vim 编译器:g++ 调试器:gdb 辅助编译工具:Makefile原理图首先说的是client:client要完成的功能当然首先就是数据的接收和发送了(都从server接收和发送给server),其次,作为一个client,没有一个窗口界

2016-09-05 12:43:08 618

原创 为什么构造函数不能是虚函数

为什么构造函数不能是虚函数?首先,构造函数是用来构造对象的;其次,我们是通过对象内存中的虚表指针来调用虚函数的。那么,在对象还没有构造好的情况下,又去哪里找虚函数呢?所以构造函数不能是虚函数。

2016-09-04 16:39:07 369

原创 Linux信号通识

何为信号信号是操作系统提供的一种向进程通知发生了某种特定事件的机制。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。直接看概念可能还是很模糊,所以从最简单的例子开始:用户输入命令,在Shell下启动一个前台进程用户按下Ctrl-C,这个键盘输入产生一个硬件中断如果CPU当前正在执行这个

2016-09-03 13:57:19 666

原创 进程间通信之共享内存

何为共享内存共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共

2016-09-02 14:47:30 2037

原创 进程间通信之信号量

何为信号量信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。对信号量的操作当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用:大于0,资源可以请求,将信号量的值-1(P操作);等于0,无资源可用,进程会进

2016-09-02 13:58:17 4979

原创 客户端-服务器-代理模型

引言(声明:纯技术博客!)曾几何时,在国内还是可以访问google、faceboook、youtobe之类的网站的,后来由于防火墙的原因,导致我们不再能够访问这些网站了,不免为人生一大憾事!后来出于各种各样的需求,例如查找学习资料等,就有人想要翻墙了,于是就有了代理。原理代理实现的关键在于如何绕过防火墙,得先知道防火墙是如何阻止我们访问外网的?大致有以下三种手段:域名劫

2016-09-01 14:54:08 2110 1

原创 LInux目录与文件权限

首先,进入一个目录需要什么权限?在当前目录下穿件一个权限为000的目录dir用于测试:          当然现在肯定进不去,提示权限不够:          预计进入目录需要执行权限,加个x试试!          OK!一次成功,对于目录来说进入就是执行的意思。在目录里边touch一个file用来测试:          尴尬了,没有创建文件的权限,

2016-08-30 13:50:53 325

原创 进程间通信之消息队列

何为消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题。消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列

2016-08-29 16:21:59 839

原创 进程间通信之管道篇

何为进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都是看不到的。所以进程之间如果要交换数据就必须通过内核。在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。        进程间通信的本质,就是要让不

2016-08-28 14:22:55 1609 1

原创 进程程序替换

进程程序替换用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换(也仅仅替换代码和数据,其它不变),从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。其实有六种以exec开头的函数,统称exe

2016-08-28 13:39:31 621

原创 进程等待

为什么需要进程等待?一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或者waitpid获取这些信息,然后彻底清除掉这个进程,当它终止是Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。当

2016-08-28 13:15:12 1032

原创 C语言 FILE结构体

C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE。这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。#ifndef _FILE_DEFINEDstruct _iobuf {    char *_ptr; //文件输入的下一个位置    int _cnt; //当前缓冲区的相对位置    char *_base; //指基础位置(即是

2016-08-27 15:16:23 2437

原创 vfork死循环问题

关于vfork函数的一个问题。#include #include #include #include int main(){ int g_val = 100; pid_t id = vfork(); if (id == 0) { g_val++; printf("child runing first...%d:%p\n", g_val, &g_val); sle

2016-08-27 14:58:45 1012

原创 拜访-美团校招原题

题目描述现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10

2016-08-26 19:03:50 840

原创 进程内存印象

Linux下C程序生成主要由四个步骤组成:预编译、编译、汇编、链接。编译器gcc经过 预编译、编译、汇编3个步骤将源程序文件转换成目标文件。如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中,程序转为进程通常需要以下步骤:  *内核将程序读入内存,为程序分配内存空间;

2016-08-25 19:59:34 625

转载 HTTP协议详解(真的很经典)

转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspxAuthor :Jeffrey引言HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1

2016-08-24 10:19:19 551

原创 哈希笔记

引言HashTable-散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构。 它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表,也就是哈希表。构造哈希表的几种方法直接定址法取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为

2016-08-20 15:54:22 474

原创 风口的猪-中国牛市--笔试题

题目描述风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。设计算法,计算你能获得的最大收益。 输入数值范围:2

2016-08-18 14:03:18 477

原创 用C++实现文件压缩

乍一听,这个文件压缩的名字貌似是很高大上的,其实,在数据结构中学完Huffman树之后,就可以理解这个东西其实不是那么的高不可攀。文件压缩所谓文件压缩,其实就是将对应的字符编码转换为另一种占据字节数少的编码来进行存储。举个栗子:有一串文本:aaaabbbccd,其中单独将这串字符存放在文件中,它所占据的将会是至少10个字节(为什么说是至少,因为还有一些必要的文件信息要保存的说)。由

2016-08-15 00:28:43 21500 5

原创 I/O多路转接之select

什么是select?首先它是系统调用,系统提供它用来实现多路复用输入/输出模型。利用它可以让我们的程序来监视多个文件句柄。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。          参数nfds代表要监听的文件描述符的最大值加1。接下来三个参数分别表示要监听事件对应的文件描述符集:可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集

2016-08-01 21:38:21 380

原创 最简单的server/client程序

编写了一个最简单的server/client聊天工具练练手:server.c 的作用用是接受client的请求,并与client进行行简单的数据通信,整体为一一个阻塞式的网网络聊天工工具。server.c:#include #include #include #include #include #include #include #include const shor

2016-07-24 22:51:43 2704

原创 守护进程

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。Linux系统启动时会启动很多系统服务进程,这些系统服 务进

2016-07-21 13:35:47 355

空空如也

空空如也

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

TA关注的人

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