- 博客(32)
- 收藏
- 关注

原创 【Muduo源码分析】 Muduo源码分析系列总览
本系列主要是分析Muduo网络库的执行流程,让大家有一个大致的认识。网络库主要是完成对三个半事件的关注。本系列的具体信息如下:连接的建立处理:https://mp.youkuaiyun.com/postedit/99467217连接的断开处理:https://blog.youkuaiyun.com/hello_ape/article/details/99482349数据的接收:https://blog....
2019-08-14 10:51:37
309
原创 c++中chrono学习
chrono是一个时间库,可以方便的用来计时,测量一些性能。在chrono中,有三个概念,分别是:duration、time_point和Clocks。duration从单词上可以看出,表示一段的时间。template <class Rep, class Period = ratio<1> > class duration;rep 和period之间存...
2019-08-14 16:04:08
934
原创 【Muduo源码分析】 解读muduo如何发送数据 TcpConnection Buffer
本文旨在讲述muduo网络库数据的发送流程。首先明确一点,Muduo中的epoll使用了水平触发方式,而不是边缘触发。TcpConnection首先需要增加应用层的缓冲区Buffer outputBuffer_; 我们看到在TcpConnection类内,提供了两个数据发送函数,分别是TcpConnection::send,TcpConnection::sendInLoop。前者...
2019-08-14 16:01:15
478
原创 【Muduo源码分析】 解读muduo如何接收消息 TcpConnection Buffer
本节处理消息的接收。消息的接收是被动事件,易于处理。首先讲解用户的消息处理函数注册过程。用户需要自己注册自己的消息接收处理函数。例如下面这样的消息回调函数。void onMessage(const muduo::TcpConnectionPtr& conn, muduo::Buffer* buf, muduo::Ti...
2019-08-14 11:20:57
355
原创 【Muduo源码分析】 解读muduo如何断开连接 TcpConnection
在muduo中只有一种连接断开方式,就是被动关闭,也就是套接字上read返回0.(当然现在也加上了主动关闭),本文探讨被动关闭的流程。首先TcpConnection::handleRead中,如果read 返回0,去执行handleClose。void TcpConnection::handleRead(Timestamp receiveTime){ loop_->asser...
2019-08-14 10:44:57
751
2
原创 【Muduo源码分析】muduo的EventLoop 解读
Muduo奉行的是每个one loop per thread,意思是每个线程只有一个EventLoop对象。在Muduo中,称创建了EventLoop对象的线程是IO线程。我主要关注大体框架,有些细节暂时不关注。首先看看构造函数(下列源码源自Muduo的教程示例)EventLoop::EventLoop() : looping_(false), quit_(false), ...
2019-08-13 21:51:44
619
原创 【Muduo源码分析】muduo的Tcpserver 和Acceptor 解读
本文章主要分析在Muduo网络库中,服务端如何建立连接的。首先看Tcpserver的构造函数(本系列主要基于示例程序而言,可能与最终的Muduo版本存在出入,但总体框架一致)TcpServer::TcpServer(EventLoop* loop, const InetAddress& listenAddr) : loop_(CHECK_NOTNULL(loop)), ...
2019-08-13 20:24:26
248
原创 牛客网笔试摄像头无法使用
自己最近做笔试,一开始摄像头始终无法使用。自己的配置是笔记本 + 外接摄像头。操作系统是win10,已经更新至最新版本,chrome也是最新版本。其他应用都能正常使用摄像头最后发现是权限问题。需要在win10下打开相机和麦克风的权限。我一开始没有打开麦克风权限,只打开了相机权限,能够进行其他应用使用摄像头,但是牛客就是不行。后来发现是麦克风权限问题。只要打开就好,即使不给web应用...
2019-08-11 14:09:43
14681
2
原创 【Linux】mq_open函数打开失败原因
最近在看IPC,自己在编写Posix消息队列时,遇到mq_open无法打开,总是返回错误。因为在posix标准中,并不是所有的名字都可以使用,必须是以 / 开始,并且名字里只能包含一个 / 。代码如下,如果使用NAME ,输出success。如果使用NAME1,输出erro#include <stdlib.h>#include <sys/stat.h>#inc...
2019-08-06 22:02:17
2681
1
原创 【c++】mutable关键字讲解
有时候会有这样的一种需求,想要在const成员函数内,修改某个成员变量的值。那么我们需要将这个成员变量使用mutable关键字修饰,这样就可以在const成员函数内修改。class A{private : mutable int cnt_a = 0;public: int getval()const;}; int A::getval()const { ++cnt_a; /...
2019-08-06 22:00:33
186
原创 【C++】默认构造函数的分析
如果没有任何用户定义的构造函数,会隐式申明一个默认构造函数,但是这个默认构造函数是无用的。 只有当编译器需要的时候才会产生一个默认构造函数。 只有下面的四种情况,才会产生有用的默认构造函数 1、如果一个类没有任何构造函数,但是这个类有一个类成员对象,这个类成员对象含有默认构造,那么这个类的隐式默认构造就是有用的。 如果用户定义了默认构造函数,并且...
2019-05-27 13:54:07
258
原创 【C++】构造函数和默认构造函数
构造函数是指用来控制类对象的初始化的过程,负责初始化类的数据成员。构造函数是这一类函数的统称。用来控制对象的默认初始化过程的构造函数,称为默认构造函数,默认构造函数无需任何实参。如果我们没有声明任何用户构造函数,那么此时将会有一个隐式构造函数被声明,这个构造函数称为合成的默认构造函数。但是这个隐式构造函数是无用的。看下面这个例子我们发现此时对象t2的成员并没有被初始化,因为此时并...
2019-05-27 10:44:03
363
原创 【docker】docker 创建容器的一些参数选项
--name 为容器创建别名, -it 保留命令行运行, -p 8888:8888 将本地的8888端口http://localhost:8888/ 映射, -v/Users/kaiyiwang/Code/ai/notebooks:/notebooks/data将本地的/Users/kaiyiwang/Code/ai/notebooks文件夹挂载到新建容器的/notebooks/dat...
2019-05-22 15:25:33
1825
1
原创 【进程】Linux子进程回收--wait、waitpid
两个函数的原型如下: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);可以通过status获取子进程的退出状态,如果不关心,可以将status置为NULL...
2019-05-10 20:43:14
359
原创 c语言中存储类型和static关键字
变量的存储类型决定变量何时创建、何时销毁、值保持多久。 有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器 缺省存储类型取决于变量的声明位置。 代码块之外申明的变量存储于静态内存中。这些变量也称为静态变量。(也就是具有文件作用域的标识符) 静态变量在程序运行之前创建,在程序的执行期间始终存在,始终保持原来的值,除非赋给它另外的值或者程序结束...
2019-05-07 11:22:42
885
原创 c语言中的链接属性
如果程序由多个源文件组成,在不同的源文件中,出现多个同名的标识符,该怎么处理?这个时候需要考虑标识符的链接属性。标识符的链接属性决定如何处理不同文件中出现的标识符。一共有三种链接属性,分别是:external(外部),internal(内部),none(无)。none没有链接属性的标识符被当作单独的个体。internal属于internal的标识符在同一个文件内的所有声明都是指向同...
2019-05-07 11:17:48
496
原创 c语言中作用域
当变量在程序中的某个部分被声明时,它只有在程序的一定区域被访问。这个区域由标识符(变量)的作用域决定。在c语言中,一共有四种作用域,分别是代码块作用域、文件作用域、原型作用域和函数作用域。代码块作用域:由{} 标识的区域称为代码块作用域。在代码块内部声明的标识符都具有代码块作用域。各个代码块的作用域不重叠。 { int i = 10; int j;...
2019-05-06 20:54:16
1522
原创 【c++】虚函数讲解
虚函数的作用当涉及继承关系的时候,对于某些函数,基类和派生类希望有各自的版本,那么基类可以将函数声明为虚函数。对于基类而言,其中的成员函数可以分为两种,一种希望派生类直接继承;第二种希望派生类有自己的版本,此时应当声明为虚函数。对于派生类而言,并不是一定需要重写从基类继承来的虚函数。如果重写虚函数,那么派生类将有自己的版本,如果不重写,那么将使用基类的版本。override关键字如...
2019-04-12 11:25:24
187
原创 【算法】小和问题
问题描述:在一个数组中,每一个元素左边比当前元素值小的元素值累加起来,叫做这个数组的小和例如:[2,3,4,1,5]2左边比2小的元素:无3左边比3小的元素:24左边比4小的元素:2,31左边比1小的元素:无5左边比5小的元素:2,3,4,1小和small_sum = 2 + 2 + 3 + 2 + 3 + 4 + 1 = 17可以使用归并排序思想,来解决小和问题int ...
2019-04-12 10:10:59
543
原创 【算法】插入排序、冒泡排序、选择排序、归并排序 C语言实现
简单算法就直接上代码了插入排序voidprintval(int *a, int n){ for (int i = 0; i < n; ++i) std::cout << a[i] << std::endl;}void insertsort(int *a, int n){ for (int i = 1; i <= n - 1; ...
2019-04-11 11:26:04
607
原创 【c++】左值、右值、左值引用、右值引用
左值、右值在C语言中,左值认为是赋值语句的左侧,右值认为是赋值语句的右侧。在C++中,意义稍有不同。C++中,每一个表达式会产生一个左值或者右值,相应的,该表达式也就被称作“左值表达式", "右值表达式"。一个左值表达式的求值结果是一个对象或者是一个函数。左值可以当右值使用,而右值不能当左值使用。《C++Prime》中这么简单归纳左值和右值:当一个对象被用作右值时候,用的是对象的值(...
2019-04-10 22:23:19
1099
原创 【c++】定义类的拷贝、赋值、移动操作以及注意事项
当定义一个类时,需要考虑5种特殊的成员函数。分别是:拷贝构造、拷贝赋值、移动构造、移动赋值和析构函数。这些函数操作称为拷贝控制操作。拷贝构造函数如果一个构造函数,第一个参数是自身类类型的引用,其他参数有默认值。那么这个构造函数称为拷贝构造函数。自身类类型必须是一个引用,通常使用const修饰。如果不是引用类型(传值参数),那么在实参给形参赋值时,会发生拷贝行为,又会调用拷贝构造,成为一个...
2019-04-10 20:30:40
547
原创 【网络编程】TIME_WAIT和2MSL
当客户端接收到服务端发送的FIN后,即进入TIME_WAIT状态。客户端在TIME_WAIT状态需要维持2个MSL时间。MSL 是max segment lifetime缩写,值IP 数据包在英特网中最大的存活时间。TIME_WAIT有以下两个原因:1、服务器可能无法收到客服发送的最终ACK,导致服务器无法关闭连接。由于服务器没有收到ACK,将会再次发送FIN,当客户处于TIME...
2019-03-30 21:30:30
239
原创 【信号】Linux信号捕捉之sigaction
sigaction是系统提供的另一个信号处理函数。负责检查或修改指定信号的关联处理动作。函数原型如下:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);signum是指需要处理的信号编号,act 和oldact都是结构体指针,如果不需要...
2019-03-30 08:49:07
297
原创 【信号】Linux信号捕捉之signal
首先明确信号是一种软中断。在操作系统中,当产生了一个信号,内核有三种方式处理该信号。1、执行默认操作。对于大部分的信号,系统默认操作都是终止进程。2、丢弃。意味着信号虽然产生,但是被内核丢弃,没有递送给进程。3、捕捉。内核将调用用户处理函数(捕捉函数)。下面讲讲信号捕捉。最简单的是signal函数,函数原型如下:typedef void (*sighandler_t)(int...
2019-03-29 14:16:19
633
原创 【线程】Linux线程的回收-----pthread_join
pthread_join函数负责线程的回收,回收系统分配的资源,主要是线程pcb。pthread_join的功能和waitpid类似。pthread_join 的函数原型如下:int pthread_join(pthread_t thread, void **retval);第一个参数是线程的id号线程退出时使用pthead_exit()函数,返回退出状态。第二个参数获取线程的退出...
2019-03-29 13:28:37
1105
原创 【c++】c++中,子类是否可以重载父类的函数
#include "iostream"using namespace std;class base{ //定义一个简单的父类public:void print(){ //简单的打印函数cout << "base print" << endl;}};class child:public base {public:void print(){ /...
2019-03-15 10:59:58
3233
1
原创 【c++】c++中顶层const与底层const
首先看下定义顶层const是指 const修饰的是指针,即此指针是常量指针,一旦指向某个对象,则不能指向其他对象底层const是指 const修饰的是指针所指向的对象为常量,不能通过指针去修改对象的值const int *pa;//底层constint a;int *const pb=&a; //顶层const,需要定义时初始化以下则是C++ Prime英...
2019-03-15 10:59:32
599
原创 opnet14.5+VS2008+WIN7的安装方法
opnet也折腾了一段时间,之前按照网上的配置方法进行配置,可是运行项目demo时,出现了一些错误,所以直接卸载原来的安装,重新来过。(由于许多文件会产生在C盘下,加上本人是强迫症,所以安装了虚拟机,可以随便折腾)第一步安装VS2008就不用说了,直接根据需要一路next就行。如果只是需要配合opnet使用,可以只装VC选项,其他的选项不勾选。然后配置环境变量,之前看过配置环境变量...
2019-03-15 10:59:07
645
2
原创 直接插入排序算法C++实现
最近开始学习算法导论,这篇文章就当作学习开篇了,有些简单的算法就只给出代码实现了,详细的介绍相信大家都能掌握,此标签下的算法都是以C++语言实现。算法的伪代码如下,理解下思想INSERTION-SORT(A)for j=2 to A.lengthkey=A[j]//insert A[j] into the sorted sequenceA[1.....j-1]i=j-1...
2019-03-15 10:58:26
1926
原创 【信号】Linux信号量基本概念
当某个信号出现时,内核有三种处理方式:1、忽略信号。忽略信号,是内核没有将信号递送给进程。2、捕捉信号。3、执行默认动作,对于大部分信号,默认操作时终止该进程对于9号和19号信号,无法忽略、捕捉、修改默认动作在信号处理程序中保证调用安全的函数,称之为可重入函数。信号是由事件的发生而产生的。事件可以有以下几种形式:可以是硬件异常,可以是软件条件(定时器),可以是终端产生...
2019-03-14 20:23:11
275
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人