主题模板
主题模板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 ...
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++问题小记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++智能指针的使用
c++智能指针的使用官方参考
普通指针的烦恼:内存泄漏,多次释放,提前释放
智能指针 负责自动释放所指向的对象。
三种智能指针 shared_ptr,unique_ptr,weak_ptr;
将shared_ptr存放在一个容器中,不再需要它的时候,要erase掉。
allocator负责封装堆内存管理的对象,它们在整个标准库中使用,特别是STL容器使用它们来管理容器内部的所有内存分配,大部份情况下,程序员不用理会,标准容器使用默认的分配器称为std :: allocator。
shared_ptr shared_ptr
多个指针指向相同的对象;
使用引用计数,引用计数是线程安全的,但是对象的读写需要加锁。
不可以直接将指针直接赋值给一个智能指针,因为指针指针是一个类。
get获取原始指针
最大的陷阱就是循环引用,这会导致内存无法正确释放,导致内存泄漏
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <iostrea ...
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 ...
C语言关键字
static在C语言中static关键字有以下的作用
1,可以用来修饰局部变量。局部变量在函数内部定义的,只有在函数内部有效(作用域),其缺省的存储方式是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,函数执行结束后变量的内存单元就会被释放掉(生命周期)。用static声明局部变量时,则会改变变量的存储方式,使变量成为静态局部变量,即在编译时就为变量分配内存,直到程序运行结束退出才释放内存单元。如果在子函数中的变量,如果想要这个变量在函数执行结束后不被释放掉,可以使用static修饰。
2,static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
3,static修饰一个函数,则对函数的连接方式产生影响,这个函数的只能在本文件中调用,不能被其他文件调用。这个有点类似于C#中的private。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外对函数本身也是一种保护机制。
const const关键字用来定义常量,被它修饰的变量值不能再改变。
const在修饰变量的时候一定要初始化, ...