- 博客(21)
- 资源 (2)
- 收藏
- 关注
原创 设计模式的概念及其基本原则
1. 设计模式概念 在一定的环境中总能用固定的套路解决实际问题,这种套路就叫做设计模式。这些套路将问题标准化:对各部分进行抽象、归纳和解耦合。注意,设计模式的实现基础是多态。 设计模式可分为3个类别: (1)创建型模式:通常和对象的创建相关,涉及到对象实例化的方式(5种) 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式 (2)结构型模式:描述如何组合类和对象以
2017-12-29 18:22:35 1182
原创 组合按键的软件设计(c语言)
需求: 根据用户的四个按键的(上下左右)显示对应的内容,左右键切换显示项目名称,上下键切换切换该项目的具体信息条目。另外有一个无符号整型变量上的每一位用于控制项目的显示与否,该位为1则显示对应项目,反之则不显示该项目。 组合按键采用面向对象的思想,加上数据结构中的双向链表,这样的组合按键需求十分容易实现。 下面是对上述需求的模型化: Linux终端用于显示,键盘上的w、s、a、
2017-12-28 18:37:41 4658
原创 Linux网络编程的相关信号
《Linux高性能服务器编程》阅读笔记: SIGHUP、SIGPIPE和SIGURG是网络编程中密切相关的信号。 SIGHUP: SIGHUP信号的触发时机是在进程的控制终端被挂起,对于没有控制终端的网络后台程序来说,通常是利用SIGHUP信号来强制服务器程序重读相关的配置文件,一个典型的例子就是xinetd超级服务器程序。 SIGPIPE: 往读端关闭的管道或socket连接中写数据将会触发
2017-12-25 19:38:39 1381 1
原创 Linux系统上的信号
《Linux高性能服务器编程》阅读笔记: 信号机制就像单片机上的中断机制一样,中断机制需要一个中断源,同理,信号机制也需要信号源。信号的来源有: (1)用户:用户通过终端键入特殊字符(如ctrl+c,针对前台进程) (2)进程:运行kill命令或者kill()系统调用 (3)系统:系统异常(如浮点异常、访问非法内存)、系统状态发生变化(如alarm定时器引起SIGALARM信号)
2017-12-25 19:03:38 670
原创 派生类覆盖基类的重载的函数
和其他函数一样,类的成员函数不论是否是虚函数都可以被重载(重载的发生需要是在同一作用域)。然而,派生类一旦声明了一个和基类重载函数同名的函数,派生类将会覆盖基类的所有重载函数,也就是说派生类可以覆盖基类重载函数的0个或全部个实例。 如下代码:class Base{public: void func() { printf("Base func()\n"); }; void fun
2017-12-24 15:42:34 6391 3
原创 派生类向基类的自动类型转换
在c++中,派生类向基类的自动类型转换只对指针或引用有效,在派生类对象和基类对象之间不存在这样的转换。将一个派生类对象初始化和赋值给一个基类对象,事实上调用的是基类的拷贝构造函数和赋值操作符重载函数,因为这两个函数的参数是基类类型的const引用,所以还是基于引用的自动类型转换。 派生类向基类的自动类型转换时c++类继承的难点之一,能力有限,先尝试表达自己的看法。转换操作主要发生在: (1)
2017-12-23 21:30:11 2089
原创 c++类的不同继承方式
c++类中成员有3种访问属性:public、private和protected,派生类对基类的继承方式同样是这3种。c++类对一个继承而来的成员的访问权限受两个因素影响: (1) 该成员在基类中的访问权限说明符 (2) 派生类的继承方式 需要注意,上述是站在一个派生类的使用者(包括继承该派生类的新派生类)而言的。所站在派生类的实现者而言,他对继承而来的成员的访问权限只是上述的第一点,即
2017-12-23 15:53:50 7370
原创 编写简单通用makefile
在Makefile基础中总结了makefile最常用的基础,利用这些知识点,足矣编写通用makefile运用于c/c++项目中。本文基于这样的文件编写makefile: 编写makefile需要实现: (1) 将bank.cpp编译成静态库bank.a/动态库bank.so; (2) 将bank.a和bank.so拷贝/opt/lib目录下; (3) 将bank.h拷贝
2017-12-16 21:57:51 1317
原创 Makefile基础
本文总结了makefile的概念及基础语法,不涉及makefire的内置函数。比较简单,是阅读、编写makefile基础。 1、makefile可以理解为是一门新的脚本语言,或者是一种工具,它专门用于编译:项目越庞大,代码文件越多,越能体现makefile的功能之强大。 2、makefile作为一门脚本语言,所以自然是属于解析型语言。解析型语言由解析器去解析成计算机所能识别的二...
2017-12-16 16:40:08 1178
原创 为什么有的操作符重载函数只能是成员函数?
出自于c++ primer 5e的一句话: 赋值(=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员(函数)。 为什么?对于赋值运算符来说,我们知道一个c++类,程序员如果没有为其定义了赋值操作符重载函数,编译器也会隐式的定义,这样倘若再定义全局赋值运算符重载函数,将会发生二义性。即使编译器允许这样的定义手法,在调用的时候也编译不过:cls& operator=(cls&
2017-12-16 15:32:45 10949 4
原创 Linux IO复用--epoll机制
《Linux高性能服务器编程》阅读笔记:1. epoll机制的相关函数 epoll和select()、poll()不同,select()和poll()是通过该函数(单个)实现IO复用,而epoll用一组函数来实现IO复用。epoll把用户关心的文件描述符上的事件专门放在一个内核事件表(结构体)中,从而无须像select()和poll()那样每次调用都需要重复传入文件描述符集(如下poll()中的f
2017-12-12 18:45:08 740
原创 Linux IO复用--select()和poll()
《Linux高性能服务器编程》阅读笔记: Linux系统中IO复用的系统调用有selece()、poll()和epoll()。IO复用使得程序可以同时监听多个文件描述符的就绪事件的发生,应用场景如: (1) 服务端程序同时处理监听socket和连接socket (2) 服务端要同时处理TCP请求和UDP请求 (3) 服务端要同时监听多个端口或者处理多种服务请求 (4) 客户
2017-12-11 19:39:01 4984 1
原创 服务端基本框架和IO模型
《Linux高性能服务器编程》阅读笔记:1. 服务端基本框架 服务器的基本框架都是一样的: 不同之处在于逻辑的处理。不管是一台服务器还是一个服务器机群,以可以用上图描述: (1) I/O处理单元即管理客户连接的模块,负责: 等待并接受新的客户连接,接收客户数据,将服务端响应数据返回客户端。注意,数据的收发也不一定是在I/O处理单元执行,也可能在逻辑处理单元中执行,这取决于事件处理模式。对服
2017-12-11 18:31:25 949
原创 Linux网络编程基础--socket常用选项
《Linux高性能服务器编程》阅读笔记: Linux系统中,有控制文件描述符属性的通用Posix系统调用fcntl(),还有两个专门用来读取和设置socket文件描述符属性的方法:#include <sys/types.h>#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,
2017-12-07 18:55:04 971 1
原创 Linux网络编程基础API--TCP的数据读写API
《Linux高性能服务器编程》阅读笔记:1. TCP通信的读写(收发)接口 因为”Linux系统上”一切皆是文件”,那么自然读写文件用的API read()/write()同样适用于socket。不过Linux还提供了几个专门用于socket数据读写的系统调用。#include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockf
2017-12-05 19:45:42 1517
原创 Linux网络编程基础API--socket文件描述符API
1. 创建socket Linux系统上”一切皆是文件“,socket也不例外,它是可读/可写/可控制/可关闭的文件描述符。要实现socket通信,双方都需要建立各自的socket对象。#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, in
2017-12-05 19:33:58 1960
原创 Linux网络编程基础API--socket地址API
1. 主机字节序和网络字节序1.1 大小端原理 网络通信使得数据从一个主机传递到另一个主机。然而在不同的的处理器在管理内存单元上的数据时,对需要存放在多个内存单元地址的某一数据的处理方式不尽相同,因此对数据的解析结果也不同。目前处理器数据处理类型有大端和小端两种方式。 小端(Little-endian)模式: 操作数的存放方式为高地址存放高字节。 大端(Big-endi...
2017-12-04 19:23:50 431
原创 vim代码跳转工具ctags安装及使用
做Linux c/c++的开发,ctags是一个很有用的工具。结合vim编辑器,可以轻松跳转到变量/函数的定义处。在ubuntu上具体的安装使用步骤为: (1) 下载ctags工具$ sudo apt-get install ctags (2) 使用,以查看NULL的原型为例: NULL的定义肯定是在系统标准头文件中,即/usr/include和/usr/local/include。假设我
2017-12-04 18:17:34 3089
原创 c++有序关联容器中键类型的约束
本文以map为例来解释有序关联容器中键类型的约束。 map是键-值对的集合,可以理解为关联数组: std::map<int, string> map1;map1.insert(make_pair<int, string>(4, "linux"));map1.insert(make_pair<int, string>(2, "c/c++"));map1.insert(make_pair<int
2017-12-02 17:29:05 459
原创 TCP协议--带外数据和超时重传
《Linux高性能服务器编程》阅读笔记:1. 带外数据 有些传输层协议具有带外(Out Of Band, OOB)数据的概念,用于迅速告知对方本端发生的重要事件。因此带外数据比普通数据(也称为带内数据)有更高的优先级,不论发送缓冲区中是否有排队等待发送的普通数据,带外数据总是被立即发送。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输层普通数据的连接中。但是在实际应用中,带外数据的使用
2017-12-01 18:31:14 1758
原创 TCP协议--应用程序的数据交换
《Linux高性能服务器编程》阅读笔记: TCP报文段所携带的应用程序数据按照长度可分为2种: 交互数据和成块数据。交互数据仅包含很少的字节数据,使用交互数据的应用程序对实时性的要求高,如telnet、ssh等。成块数据的长度通常为TCP报文段允许的最大数据长度,使用成块数据的应用程序对传输效率要求高,如ftp。 下面分析一下比较简单的交互数据流: 使用telnet登录本机,并在shell
2017-12-01 18:19:56 1017
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人