主题模板
主题模板https://xutopia77.github.io/
20200719104425712
20200719103822090
categories:keywords:description:
comments:cover:toc:toc_number:toc_style_simple:copyright:copyright_author:copyright_author_href:copyright_url:copyright_info:mathjax:katex:aplayer:highlight_shrink:aside:
12345678910//libevent的http服务器简单实现方式#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { //自定义信号处理函数 signal(SIGHUP , signal_handler); evhttp_free(httpd); return 0;}
基于libevent的多线程http服务器
基于libevent的多线程http server项目中的业务需要实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源,项目是运行在嵌入式linux系统中的,并且某一时刻可能有大量并发请求,综合考虑,选择libevent实现一个多线程的http服务器。
本文使用的libevent的版本是libevent-2.1.12-stable。也是目前最新的稳定版本。
程序源代码可以见公众号 xutopia77 文章 基于libevent的多线程http服务器
在开始论述之前,我希望读者对IO多路复用器(尤其是epoll),以及对reactor和proactor模式有个大致的理解。对于这两个方面,网络上已经有大量的文章了,我自己也写过很多,如果读者想要了解这两项内容,可以点击下面链接查阅: select,poll,epoll的区别以及使用方法。
首先,libevent是什么,我们看下官方的介绍:
The libevent API provides a mechanism to execute a callback function when a spec ...
git的merge和rebase的使用方法
git分支合并在工作开发时,常用git作为版本控制。开发的过程中,一般不在主分支上开发,会拉出一个功能分支(feature)进行开发。功能开发完成后,再通过git merge把功能分支上的代码合并到主分支中。
有时我们在功能分支上提交了很多冗余的commit,我们想要把这些commit合并到一起,提交到主分支中。这时可以使用git rebase命令,进行变基,把冗余的commit合并到一起。
mergegit merge的常用选项参数
git merge --abort
该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)。
git merge --ff
--ff是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。
git ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
c++的vector的使用方法
c++的vector的使用方法,创建,初始化,插入,删除等。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include "ex_vector.h"#include <iostream>#include <vector>#include <string>using namespace std;void ex_vector01_main(){ //####################################################################################### //初始化vector的方法 vector<int> v1; //v1是一个空vector,它的潜 ...
c语言指针
以下讲解是按照如下这个程序的执行顺序来讲解的
一,程序中的c语言指针12345678910111213141516171819202122int a, b; //这是一个普通的整型变量int* p;//这是一个整形的指针a = 3;b = 4;6printf(" a的地址:%d;\r\n", &a);printf(" b的地址:%d;\r\n", &b);printf(" p的地址:%d;\r\n", &p);printf(" p的值:%d,现在p的值是不确定的,目前只是为p申请了地址,还没有为它赋值;\r\n", p);p = &a;//取址运算/* p现在指向a */printf(" 利用取址操作p = &a;,把a的地址赋值给p,现在p的值是%d,也就是a的地址;\r\n", p);printf(" p的地址没有变化,p的地址仍然是%d,在这个地址上存储的是变量a的地址;\r\n", & ...
c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)
c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)c++的左值,右值 精辟总结
当一个对象被用作右值的时候,使用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)左值右值,完美转发参考文档。
左值持久,右值短暂;move:显示地将一个左值转换为对应右值的引用类型,还可以获取绑定到左值上的右值引用,int&& rr3 = std::move(rrl); 使用move就意味着除了对rrl赋值或销毁它外,我们不再使用它。
std::forward()与std::move()相区别的是,move()会无条件的将一个参数转换成右值,而forward()则会保留参数的左右值类型,可以使用std::forward实现完美转发。
移动语义解决了无用拷贝的问题:移动构造函数;
右值引用:函数的返回值。
int& 左值引用
int&& 右值引用
c++中无用拷贝的情况1234567891011121314151617181920212223242526272829303132333 ...
c++智能指针的使用
c++智能指针的使用官方参考
普通指针的烦恼:内存泄漏,多次释放,提前释放
智能指针 负责自动释放所指向的对象。
三种智能指针 shared_ptr,unique_ptr,weak_ptr;
将shared_ptr存放在一个容器中,不再需要它的时候,要erase掉。
allocator负责封装堆内存管理的对象,它们在整个标准库中使用,特别是STL容器使用它们来管理容器内部的所有内存分配,大部份情况下,程序员不用理会,标准容器使用默认的分配器称为std :: allocator。
shared_ptr shared_ptr
多个指针指向相同的对象;
使用引用计数,引用计数是线程安全的,但是对象的读写需要加锁。
不可以直接将指针直接赋值给一个智能指针,因为指针指针是一个类。
get获取原始指针
最大的陷阱就是循环引用,这会导致内存无法正确释放,导致内存泄漏
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <iostrea ...
c++的模板类编译的问题
c++问题小记1,模板类编译的问题前两天在写代码时,把模板类的声明和分开放在两个文件中了,类似于下面这样:
stack.hpp:
12345678910#ifndef _STACK_HPP#define _STACK_HPPtemplate <typename Type>class stack { public: stack(); ~stack();};#endif
stack.cpp:
12345678910#include <iostream>#include "stack.hpp"template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl;}template <type ...
c++的bind使用方法
c++的bind使用方法 除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过std::bind来实现。
std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作。
如可调用 (Callable) 中描述,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向将访问其成员的对象。
官方示例
12345678910111213141516171819202122232425262728293031323334353637383940414243 ...






