自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 模拟实现select服务器

什么是I/O多路转接?对于多个非阻塞I/O,怎么知道I/O何时已经处于可读或可写状态? 如果采用循环一直调用write/read,直到返回成功,这样的方式称为轮询(polling)。大多数时间I/O没有处于就绪状态,因此这样的轮询十分浪费CPU。而一种比较好的技术是使用I/O多路转接,也叫做I/O多路复用。其基本思想为:先构造一个有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已经准备好

2017-08-03 21:15:48 379

原创 基于socket的Tcp多进程多线程服务器

套接字的概念套接字(socket)这个词在Tcp/Ip协议中,“IP地址”+ “TCP或UDP端口号”唯一标识网络通信中的一个进程,这个“ip地址”+“端口号”就称为socket.预备知识1.在实现我们的服务器之前我们需要 了解一些预备知识。 我们都知道主机有大端和小端之分,那么内存之中存储的数据也就有了大端和小端之分,而通讯双方的主机之间发送数据时因为大端和小端的缘故,发送和接受都需对数据的存储

2017-08-03 00:07:28 2157

原创 网络中的端口分类调研

计算机端口是是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域是指各主机间通过TCP/UDP等协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。但是大多数操作系统都支持多程序(进程)同时运行,端口号就保证了目的主机将数据传送给指定的进程指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构。端口其实就是队,操

2017-07-22 21:09:34 377

原创 NAT技术 与 代理服务器

什么是NAT?NAT网络地址转换(Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。ip分类: A 类:10.0.0.0~1

2017-07-22 20:35:17 538

原创 TCP定时器 和 URG.PSH版本控制位 浅析

一.URG和PSH版本控制位Tcp协议为了能保证正确有效的数据传输过程,诞生了六个版本控制位;SYN : 表示连接请求 ACK : 表示确认 FIN : 表示关闭连接的请求 RST : 表示断开连接的有效时长而今天我们主要来了解URG 和 PSH 1.URG推送位URG(紧急位):设置为1时,首部中的紧急指针有效;为0时,紧急指针没有意义。 紧急数据的起始点=序号; 紧急数据的终止点=序

2017-07-22 19:31:33 353

原创 ARP协议和ARP脚本

什么是ARP协议arp协议(Address Resolution Protocol)是一种地址解析协议。位于TCP/IP四层结构中的链路层,是通过IP地址寻MAC地址的一种协议。ARP协议是怎么工作的在局域网中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成MAC帧才能通过物理网络发送,因此发送站

2017-07-10 00:36:15 669

原创 Linux---读者写者模型

一 怎么理解读者写者模型读者写者问题就是在一些程序中,对某些资源的访问会存在两种可能的情况:一种就是写操作,写操作是可以独占资源的,具有排他性;另一种情况就是读操作,在读操作中可以有多个操作并发的去访问某种资源,它的访问方式是共享的。这种从对文件的读写操作中总结出的的这种模型叫做读写者模型。1.读者写者模型的三种关系(1)读者和读者——没有关系; (2)读者和写者——同步和互斥; (3)写者和写

2017-06-26 21:14:28 1169

原创 Linux下的生产者消费者模型模型

概念引入 linux下的生产者消费者模型举例说明就像我们在超市买东西,那么我们就是消费者,我们所消费商品的供货商显而易见就是生产者了,而其中将消费者和生产者联系起来的超市就是一个交易场所。将上述场景类比到我们实际的软件开发过程中,代码的某个模块负责生产数据(供货商),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间我们必须要有一个类似上述超市的东西来存储数据(超市),这就抽象

2017-06-23 11:32:16 434

原创 多线程编程---线程死锁

什么是死锁?是指多个线程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbreace)即互相等待的现象,当线程处于这种僵持状态时,若无外力作用,它们都将无法向前推进。举个栗子:如果同一个线程先后两次调用lock,在第一次调用时,由于锁已经被占,该线程会挂起等待别的线程释放锁,然而锁正是被自己占着的,该线程又被挂起,没有机会释放锁,因此,就永远处于挂起等待状态了,这叫做死锁(Deadlock)

2017-06-15 12:01:04 721

原创 进程间通信总结 && IPC主题三之 共享内存

之前我们已经了解了system V IPC的其他两种通信方式,今天我们来了解第三种—–共享内存一:什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存映射到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言

2017-06-14 23:00:55 300

原创 进程间通信 IPC 主题二之 信号量

IPC主题二:信号量信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识,信号量在此过程中负责数据操作的互斥,同步等功能。 一:为什么要使用信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域

2017-06-13 17:15:00 342

原创 进程间通信IPC 主题一 之 消息队列

这是我们第一接触IPC主题系列先来看看 IPC简介:XSI IPC 包括消息队列,信号量以及共享内存,他们都依托标识符和键来实现的,这就是像是管道靠文件描述符来实现一样。今天我们只了解消息队列。IPC主题一:消息队列 一:什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避

2017-06-11 20:42:32 345

转载 Linux下使用github教程

1. Git是什么?Git是一个分布式版本控制/软件配置管理软件,原是Linux内核开发者Linus Torvalds为更好地管理Linux内核开发而设计。相比CVS/SVN,Git 的优势:- 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度块2.GITHUB是什么?GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项

2017-06-09 11:21:08 611

原创 平衡搜索树——AVLTree

什么是AVL树?

2017-06-07 21:29:59 291

原创 Linux 多线程编程(1)

线程的概念是计算机中独立运行的最小单位,运行时占用很少的系统资源。可以把线程看成是操作系统分配CPU时间的基本单元。一个进程可以拥有一个至多个线程。线程在进程内部共享地址空间、打开的文件描述符等资源。同时线程也有其私有的数据信息,包括:线程号、寄存器(程序计数器和堆栈指针)、堆栈、信号掩码、优先级、线程私有存储空间。那可能有的人就会问了,既然我们已经有了进程,为什么还需要线程呢,线程比进程有哪些不可

2017-06-06 14:14:45 363

原创 进程间通信 --管道

进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。也就是说两个进程之间是相对独立的,而且是互不干扰没有交集的,进程间通信就是让两个进程之间产生联系。 下面是实现进程间通信的图示实现方法一:

2017-06-04 23:23:58 244

原创 简析文件描述符(fd) 和 FILE结构体的关系

文件描述符(fd) 对于linux而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。 通常情况下,将一个程序从硬盘加载到内存后,这个程序就化身为了一个进程,这时系统会默认打开三个文件:

2017-05-21 10:44:10 472

原创 模拟实现僵尸进程和孤儿进程

僵尸进程首先解释下什么是僵尸进程? 当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。接下来让我们模拟实现一个僵尸进程 下边是运行结果我们知道僵尸进程的产生是因为进程退出时父进程并没有等待子进程,也就是说,父进程和子进程是不同步的。那么有个问题,父进程是不会预测到子进程退出的

2017-05-07 14:53:45 340

原创 Linux环境下注册函数的调用顺序

为了验证atexit()函数在Linux环境下的调用顺序,我们先来写四个fun函数,这样而且每个函数里边加一句话,这样我们就能更加清晰的在屏幕上看到 各个函数的调用顺序了。下边我们直接看代码。 这个是运行结果: 过程分析: atexit函数先注册四个fun函数然后等待3秒,再打印hello main (如果main函数中不加\n 则main函数要输出的内容会先放到标准输出的缓冲区中,当ma

2017-05-07 10:43:22 723

原创 C++ 智能指针(下)

上篇文章我们主要了解实现了auto_ptr 和 scoped_ptr,这两个实现总的来说都存在缺陷,所以在应用中使用起来不能得心应手,就有了接下来的升级版 shared_ptr,他是在scoped和auto_ptr的基础上利用了引用计数的方法解决了不同指针指向同块空间的问题,但完美的代码总是经过反复修改的代码,也存在缺陷,我们先看代码,后边解决。#includeusing namespace

2017-04-18 13:54:36 280

原创 linux下的进程描述符——task_struct

1.进程是什么?       比较官方的说法是说 进程是一个执行实例,正在执行的程序,并能分配处理器并有处理器执行的实体。但是作为初学者我们并不是怎么理解这个概念。所以通俗的来讲就是在正在执行的程序的总称,被打包到一个叫做进程控制块PCB(Process Contral Block)(位于内存)的数据结构和中,它拥有和程序一模一样的代码,而且它还增加了很多的数据结构。同时进程还拥有动态属性。

2017-04-15 16:08:34 334

原创 C++中的智能指针(上)

C++提供了4种智能指针用于对分配的内存进行自动释放,分别如下auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中auto_ptr在C++98标准引入,后三种在C++11标准中加入。虽然autoptr存在缺陷但是还是值得了解一下的。智能指针的简介      C++智能指针是行为类似于指针的类对象。它使用设计模式中的代理模式,代理了原始“裸

2017-04-13 10:27:35 216

原创 C++模板实现简单的链表和顺序表

从最初学习C语言到C++,就有一个认识就是作为一个优秀的程序猿一定要学会 ”偷懒“ ,用程序员的话来说就是复用,在C的基础上开发的C++就深刻阐明了这一道理,因为这样有太多的好处,增加了代码的可移植性,提高了可维护性。C++的模板就很有用,可以大大提高写代码的效率,同时优秀的代码总是最简洁最有效的代码。下面我们来用模板实现链表和顺序表。顺序表SeqList.h文件#define _CR

2017-04-11 11:39:08 516

原创 linux下用C++代码实现简单的进度条

首先我们来分析一下这个进度条的实现原理,我先想到的是一个数组,然后利用循环来实现,接下来的细节部分用一个 ‘ # ’ 代替百分之一的大小,加上进度条左右的中括号那么可以确定数组的大小应该是【102】,至于进度条的输出速度我们可以用之前了解过的Sleep函数来控制速率。大概情况就是这样,用代码试试看。#include #include int main() { int i =

2017-04-08 16:05:51 3586

原创 C++中的虚表(内存分布)

作为新手很容易混淆内存布局这块的虚表(虚函数表)和虚基表指针,所以就来区分下这两个到底是什么?是做什么用的,在内存中是怎么实现的来加深理解。1.什么是虚表?为什么要有虚表他在C++中的作用又是什么?虚表就是虚函数表的简称,虚函数表是通过一块连续内存来存储虚函数的地址,这张表解决了继承,虚函数(重写)的问题。在有虚函数的对象实例中都存在一张虚函数表,虚函数表就像一张地图,指明了实际应

2017-04-04 10:36:26 2136

原创 linux下的粘滞位

1.什么是粘滞位?        如果用户对目录有写权限,即使该用户不是这些文件的所有者,而且也没有读或写许可,仍然可以删除其中的文件和子目录。但是如果设置了粘滞位出现在执行许可的位置上,用t表示,其它用户就不可以删除不属于他的文件和目录。但是该目录下的目录不继承该权限,要再设置才可使用。2.粘滞位的作用又是什么?     普通文件的sticky位会被linux内核忽略, 目录的sti

2017-04-02 11:24:57 282

原创 linux操作系统下的 stat命令

有些时候,我们需要在Linux中使用stat命令来查看文件的详细信息。我们先来看下stat的情况:如图所示,会出现3个类型的时间,分别是Access,Modify,Change。下面我们就对这3个时间进行详细解释下。access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间modify time:表示我们最后一次修改文件的时间change tim

2017-03-28 12:41:01 501

原创 用C++实现双向链表

.文件#define _CRT_SECURE_NO_DEPRECATE#include #include using namespace std;typedef int Datatype;struct ListNode{ Datatype _data; ListNode* _next; ListNode* _prev; ListNode(Datatype x) :_d

2017-03-28 10:56:55 297

原创 模拟实现strcpy,strncpy,strcat,strncat,strcmp,strncmp,memcpy,memmove

1.strcpy#include #include #include void my_strcpy(char *dest, const char *src) //strcpy{ assert(src); assert(dest); while (*dest++ = *src++) { ; }}int main() { char arr1[20] = {0

2017-01-13 11:09:20 319

原创 函数调用原理——栈帧

本次主要是想通过画图结合汇编代码增加对函数调用过程中的栈结构的理解,用一段简单的代码试验。

2016-12-19 16:53:15 388

转载 vim学习笔记

安装vim包:  sudo apt-get install vim普通用户到超级用户的切换: sudo su退出超级用户:ctrl+d  或者exitvim有三种常用模式:普通模式(默认)、编辑模式、命令行模式。普通模式到编辑模式:i   退回普通模式:esc按键(escape)普通模式到命令行模式用:(冒号)   退回普通模式:esc按键(escape)

2016-12-11 15:14:18 1827 1

原创 浮点型在内存当中的存储方式

常见的浮点型:3.14159  IE10浮点数包括:float, double, long double。浮点数表示的范围:float.h中定义。

2016-12-07 11:36:09 397

原创 用C实现的扫雷小游戏

菜鸟新手,希望各位大神多多指教

2016-11-30 14:38:26 573

原创 两个有趣的逻辑推理题用编程来解答

1.   日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。#includeint main(){ int i,sum=0,flag=0; char killer; fo

2016-11-16 12:24:04 7000

原创 对于一个初学者来说最高兴的莫过于于此

对于一个初学者来说,当看到自己写的程序0 错误 0警告 正常运行真的是有一种发自内心的激动,同时也更肯定了自己。能从中获得乐趣是最重要的,兴趣是最好的导师。程序1:模拟实现用户登录的场景,可以自己设定密码,密码位数同样可以自己设定。登录次数也可以设定。#include #include #include int main(){ int i = 0; char passw

2016-11-09 12:40:15 328

原创 小菜鸟写代码遇到的那些事

一般呢,我自己学编程的方式就是先看书上的概念定义,在看些例题视频什么的接下来就自己找些简单的经典的例子自己敲上去,运行试试看,接下来就是一大堆问题,而且基本好多都是自己看过的但是放到实际中就又是另一种情况,好多我都不怎么会解决,这个给我学习造成了很大的麻烦,而且很费时间,所以我也只知道了调试比写代码更重要,要想学好编程那么我一定要熟练掌握F10,F11的运用,还有系统为各个变

2016-11-03 12:59:41 428

原创 第一次写博客

初学编程语言,第一次写博客,望大神们多多指教[抱拳][抱拳][抱拳]

2016-10-27 15:36:14 253

空空如也

空空如也

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

TA关注的人

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