- 博客(98)
- 资源 (1)
- 收藏
- 关注
原创 互斥器类
互斥器类通常,在多线程任务中,常常为了保证临界区,需要使用一定的手法限制多个进程或者线程的访问,常用的手法通常是互斥,即使用C++中的mutex:#include <mutex>using namespace std;mutex mu;mu.lock();...mu.unlock();首先来看一个例子,在程序运行过程中,某个需要锁的函数在处理数据时发生了异常:mutex mu;try{ mu.lock(); cout<<"lock".
2021-04-20 23:01:27
216
原创 客户/服务器程序设计范式
概述本节主要探究并发服务器程序设计的另两类变体:预先派生子进程:让服务器在启动阶段调用fork创建一个子进程池,每个客户请求由当前可用子进程池中的某个(闲置)子进程处理; 预先创建线程:让服务器在启动阶段创建一个线程池,每个客户由当前可用线程池中的某个(闲置)线程处理; TCP客户程序设计范式 用于测试各个范式服务器的TCP客户程序#include "unp.h"...
2020-01-29 18:14:38
462
原创 线程
概述在传统的Unix模型中,当一个进程需要另一个实体来完成某事时,它就fork一个子进程并让子进程去执行处理。Unix上的大多数网络服务器程序就是这么编写的:父进程accept一个连接,fork一个子进程,该子进程处理与该连接对端的客户之间的通信。尽管如此,但是fork调用却存在一些问题:fork是昂贵的。它要把父进程的内存映像复制到子进程,并在子进程中复制所有描述符等等。当今的实现使...
2020-01-28 00:03:32
315
原创 带外数据
概述许多传输层有带外数据的概念,有时候也称经加速数据。其想法是一个连接的某端发生了重要的事情,而且该端希望迅速通告其对端。这里的“迅速”意味着这种通知在已经排队等待发送的任何“普通”数据之前发送,也就是优先级更高。 TCP带外数据 TCP没有真正的带外数据,不过提供了紧急模式。假设一个进程已经往一个TCP套接字写出N字节数据,而且TCP把这些数据排队在该套接字的发送缓冲区中,等...
2020-01-26 21:55:07
429
原创 ioctl操作
概述ioctl函数传统上一直作为那些不适合归入其他精细定义类别的特性的系统接口。例如,Unix终端接口传统上使用ioctl访问,然后POSIX为终端创造了12个新函数:tcgetattr:获取终端属性;tcflush:冲刷待处理输入或输出。网络程序(特别是服务器程序)经常在程序启动执行后使用ioctl获取所在主机全部网络接口的信息,包括:接口地址、是否支持广播、是否支持多播等等。...
2020-01-25 22:20:29
445
原创 非阻塞式I/O
概述套接字的默认状态是阻塞的。这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待响应操作完成。可能阻塞的套接字调用可分为以下四类:输入操作,包括read、readv、recv、recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认设置)调用这些函数之一,而且该套接字的接收缓冲区中没有数据可读,该进程将被投入睡眠,直到有一些数据到达。如果...
2020-01-23 21:49:06
449
原创 高级I/O函数
概述首先介绍了I/O操作上设置超时共有三种办法; 然后是read和write这两个函数的三个变体: recv和send readv和writev recvmsg和sendmsg 如何确定套接字接收缓冲区中的数据量; 如何在套接字上使用C的标准I/O函数库;套接字超时在设计套接字的I/O操作上设置超时的方法有以下3种:调用alarm,它在指定超时期满时产生SI...
2020-01-19 23:17:51
411
原创 守护进程和inetd超级服务器
概述守护进程(daemon)是在后台运行且不与任何控制终端关联的进程。Unix系统通常由很多守护进程在后台运行(约在20到50个的量级),执行不同的管理任务。守护进程有多种启动方法:在系统启动阶段,许多守护进程由系统初始化脚本启动。这些脚本通常位于/etc目录或以/etc/rc开头的某个目录中,它们 的具体位置和内容确实实现相关的。由这些脚本启动的守护进程一开始时拥有超级用户特权。有若...
2020-01-17 23:31:54
395
原创 名字与地址转换
概述常常地,我们都会使用数值地址来表示主机,用数值端口号来标识服务器。然而出于许多理由,我们应该使用名字而不是数值:名字比较容易记住;数值地址可以变动而名字保持不变;随着IPv6上转移,数值地址变得相当长,手工键入数值地址更易出错。本节讲述在名字和数值地址间进行转换的函数:主机名与IPv4地址之间进行转换:gethostbyname 和 gethostbyaddr 服务名字和端口号之间进...
2020-01-14 17:33:14
804
原创 使用select的TCP和UDP服务器
使用select函数的TCP和UDP回射服务器程序#include "unp.h"int main(int argc, char **argv){ int listenfd, connfd, udpfd, nready, maxfdp1; char mesg[MAXLINE]; pid_t childpid; fd_set rset; ssize_...
2020-01-14 11:32:18
661
原创 基本UDP套接字编程
概述UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流。通常有一些常用的应用程序使用UDP:DNS(域名系统) NFS(网络文件系统) SNMP(简单网络管理协议)如下给出了典型的UDP客户/服务器程序的函数调用。客户不用与服务器建立连接,而是只管使用sendto函数给服务器发送数据包,其中必须制定目的地(即服务器)的地址作为参数。类似地,服务器不接受来自客...
2020-01-13 17:59:54
893
原创 套接字选项
概述有很多方法来获取和设置影响套接字的选项:getsockopt和setsockopt函数; fcntl函数; ioctl函数;getsockopt和setsockopt函数这两个函数仅用于套接字。#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname, void...
2020-01-05 23:28:00
138
原创 C++设计模式---外观模式
外观模式定义 为子系统中的一组接口(相当与上面的模块)提供一个一致的界面。此模式定义了一个高层接口,这个结口使得这一子系统更加easy使用。说白了就是:我们仅仅需调用高层的函数接口。而不用关心高层内部调用是怎样组合底层方法的。更不用关心底层函数是怎样实现的。什么是外观模式? 外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象...
2019-12-30 22:23:03
174
原创 C++设计模式---代理模式
代理模式定义专业版描述:为其他对象提供一种代理以控制对这个对象的访问; 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。戏剧性描述:房产市场不稳定,房价涨了还是涨。隔壁老王要买房,忍痛找到房产中介,中介把房介绍给老王,老王买到中意房; 这个剧情中老王是主角,演绎了一个买房的故事。房产中...
2019-12-28 23:31:27
139
原创 C++设计模式---装饰器模式
装饰器模式作用: 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰器模式有点类似于建造者模式,两者的区别是建造者模式必须按照统一的步骤来构建某个对象,而装饰器模式不需要。示例:题目是这样的:某咖啡店当卖咖啡时,可以...
2019-12-27 14:40:41
446
原创 C++设计模式---适配器模式
适配器模式(Adapter)作用: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式分为两种:类适配器模式; 对象适配器模式;在对象适配器模式结构图中包含如下几个角色:Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类; ...
2019-12-27 10:01:21
170
原创 C++设计模式---原型模式
原型模式原型模式正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。【注】深拷贝和浅拷贝的区别:浅拷贝:就是给对象中的每个成员变量进行复制,就是把A1...
2019-12-26 22:29:28
151
原创 C++设计模式---建造者模式
建造者模式含义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用具体的示例来说,就是装配一部手机,需要先放主板,再放屏幕,再放电池,最后组装外壳形成手机;而且每次发布新产品手机,更换更大的屏幕或者电池或者其他零部件,就又能卖出更好的价钱了。就是说,这些步骤都没变,变得只是每个部分的东西。优点:隔离了构建的步骤和具体的实现,为产品的具体实现提...
2019-12-25 23:21:13
137
原创 C++设计模式---概览
一、设计模式的分类总体来说设计模式可以分为三大类:创建型模式: 工厂方法模式; 抽象工厂模式; 单例模式; 建造者模式; 原型模式; 结构型模式: 适配器模式; 装饰器模式; 代理模式; 外观模式; 桥接模式; 组合模式; 享元模式; 行为型模式: 策略模式; 模板方法模式; 观察者模式; 迭代子模式; 责任链模式;...
2019-12-23 22:17:56
116
原创 Docker学习⑤
使用Dockerfile创建镜像Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。基本结构Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile主体内容分为四部分:基础镜像信息; 维护者信息; 镜像操作指令; 容器启动时执行指令;例:一个简单的示例【文档解析】...
2019-11-28 14:40:32
304
原创 Docker学习④
端口映射与容器互联Docker除了通过网络访问外,还提供了两个很方便的功能来满足服务访问的基本需求:允许映射容器内应用的服务端口到本地宿主主机; 互联机制实现多个容器间通过容器名来快速访问;端口映射实现容器访问1、从外部访问容器应用当容器中运行一些网络应用,要让外部访问这些应用时,可以用过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个49...
2019-11-27 19:00:24
117
原创 Docker学习③
Docker数据管理生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。容器中的管理数据主要有两种方式:数据卷:容器内数据直接映射到本地主机环境; 数据卷容器:使用特定容器维护数据卷;数据卷数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。数据...
2019-11-27 15:31:14
135
原创 Docker学习②
操作Docker容器容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。本章将具体介绍围绕容器的重要操作,包括创建一个容器 、 启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导人导出容器来实现容器迁移等。创建容器主要介绍Docker容器的cre...
2019-11-26 18:54:21
174
原创 Docker学习①
使用Docker镜像获取镜像镜像是获取容器的前提,官网的Docker Hub网站已经提供了数十万个镜像供大家开放下载。最好使用国内的镜像加速网站,本人使用的是以下网易的镜像加速:#网易http://hub-mirror.c.163.com修改/etc/docker/daemon.json文件,此文件ubuntu下需自己创建并写下:{ "registry-mirr...
2019-11-25 15:04:59
150
原创 Effective C++笔记⑦
定制new和delete条款49:了解new-handler的行为当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个可客户指定的错误处理函数,一个所谓的new-handler。为了指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler,那是声明于<new>的一个标准程序库函数:namespace std{ ...
2019-11-21 00:00:25
112
原创 Effective C++笔记⑥
继承和面向对象设计面向对象编程(OOP)几乎已经风靡了两个年代了,所以关于继承、派生、virtual函数等等。尽管如此,C++的OOP有可能和你原本习惯的OOP稍有不同:“继承”可以是单一继承或多重继承,每一个继承连接(link)可以是public,protected或private,也可以是virtual或non-virtual。本章节需要理解的问题:成员函数的各个选项:virtual?...
2019-11-09 23:59:10
231
原创 Effective C++笔记⑤
实现大多数情况下,适当提出你的classes(和class template)定义以及functions(和function templates)声明,是花费最多心力的两件事。一旦正确完成它们,相应的实现大多直接了当。尽管如此,还是需要注意某些东西:太快定义变量可能造成效率上的拖延 过渡使用转型(casts)可能导致代码变慢又难维护 返回对象“内部数据之号码牌”可能会破坏封装并留给客户...
2019-10-26 23:42:30
180
原创 Effective C++笔记④
设计与声明最重要、适合任何接口设计的一个准则作为开端:“让接口容易被正确使用,不容易被误用”。条款18:让接口容易被正确使用,不易被误用要开发一个接口,必须考虑可能会产生的错误。假设你为一个用来表现日期的class设计构造函数:class Date{public: Date(int month, int day, int year); ...};上述代码很...
2019-09-29 00:12:36
178
原创 Effective C++ 笔记③
第三章:资源管理所谓资源就是,一旦用了它,将来必须还给系统;否则,糟糕的事情就会发生。C++中常用的资源就是动态分配内存,如果未能及时释放归还它,将会导致内存泄露(该块内存区域将永远不能使用)。其他的资源还包括:文件描述器 互斥锁 图形界面中的字型和笔刷 数据库连接 网络sockets条款13:以对象管理资源假设我们使用一个用来塑模投资行为(例如股票、债券等)的程序...
2019-09-25 00:37:07
257
转载 【转】Qt/C++ 使用VS2015编译打包发布
1. Qt依赖库将需要发布的exe(如test.exe),放到单独的目录。 在“开始菜单”启动Qt 5.9.1 32-bit for Desktop (MSVC 2015),使用cd命令进入第1步中的目录。 执行windeployqt.exe test.exe --qmldir C:\Qt\Qt5.9.1\5.9.1\msvc2015\qml命令。 qmldir目录根据Qt版本...
2019-07-23 10:17:46
554
原创 关键字④:noexcept
断言(assertion)是一种编程中常用的手段。相比于断言适用于排除逻辑上不可能存在的状态,异常通常是用于逻辑上可能发生的错误。在异常处理的代码中,程序员有可能看到过如下的异常声明表达形式:void excpt_func()throw(int,double){...}在excpt_func函数声明之后,我们定义了一个动态异常声明throw(int,double),该声明指出了excpt...
2019-07-05 10:33:44
1144
原创 boost库学习④:boost::asio::buffer
asio::buffer常用的构造方法 字符数组 char d1[128];size_t bytes_transferred = socket.receive(boost::asio::buffer(d1)); 字符向量 std::vector<char> d2(128);size_t bytes_transferred = socket.recei...
2019-07-04 10:48:38
5817
转载 boost库学习③:program_options
program options是一系列pair<name,value>组成的选项列表,它允许程序通过命令行或配置文件来读取这些参数选项.program_options的使用主要通过下面三个组件完成: 代码流程总览 示例 #include <iostream>#include <boost/program_options....
2019-07-02 14:12:51
994
转载 boost库学习②:bind
功能boost::bind 绑定一个函数及其参数.boost::function 是类和模板的组合,它定义的对象可以指向一个函数(包装一个函数),类似一个函数指针。既可以直接指向一个函数也可以接收bind的返回值。返回值bind返回一个函数对象。function本身是一种类模板,可被看作声明的关键字。 bind1st、bind2nd(std库中的函数) bin...
2019-06-28 15:16:25
549
原创 std库学习②:accumulate
该算法在numeric头文件中定义。首先来看一个例子://定义了一个整型vector数组vector<int> vec {2, 0, 12, 3, 5, 0, 2, 7, 0, 8};按标准版的accumulate来使用,如下:std::accumulate(vec.begin(),vec.end(),35);上面的代码语句意思是:将数组从开头起至结尾的每一个...
2019-06-27 10:19:18
1961
原创 关键字③:类型转换
隐式转换 1)算数转换:在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。int int_type = 3;double double_type = 4.0012;int_type + double_type = ?上面定义了整型变量int_type,也定义了双精度型变量double_type,两者进行相加;根据类型转换,隐式转换过程中,是向着op操作中类型高进行...
2019-06-26 14:04:08
254
原创 std库学习①:transform
std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。要使用std::transform函数需要包含<algorithm>头文件。以下是std::transform的两个声明,一个是对应于一元操作,一个是对应于二元操作:template <class InputIterator, class OutputIterator, cla...
2019-06-26 10:00:36
583
原创 boost库学习①:智能指针
智能指针类型 什么叫智能指针? 智能指针是利用RAII(在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放(delete 指针):这种技法把它称之为RAII(Resource Acquisition Is Initialization:资源获取即初始化))来管理资源。 其本质思想是:将堆对象的生存期用栈对象(智能指针)来管理。也就是当ne...
2019-06-25 15:16:42
356
原创 关键字②:typename
typenametypename作为关键字有以下的用法: 作为模板元编程使用 template <typename T> template <class T>void foo(const T& t){ // 声明一个指向某个类型为T::bar的对象的指针 typename T::bar * p;}typena...
2019-06-24 16:12:19
322
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人