<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Wendell_0的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Wendell_0</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Wendell_0]]></copyright><item><title><![CDATA[core dump查看]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/121116180</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/121116180</guid><author>Wendell_0</author><pubDate>Wed, 03 Nov 2021 10:38:40 +0800</pubDate><description><![CDATA[core dump查看
@(论文笔记本)
core dump表示当程序异常终止或崩溃时，将进程此时的内存中的内容拷贝到磁盘文件中存储，以方便编程人员调试。
##1、应用场景
程序报错：Segmentation fault (core dump)
##2、使用core dump

打开core dump
ulimit -c unlimited


这条命令是在当前的终端环境开启core dump功能，并且不限制core dump文件的大小。如果需要永久生效，就得去修改/etc/security/limits.]]></description><category></category></item><item><title><![CDATA[条款05:了解C++默默编写并调用了哪些函数]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/121039640</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/121039640</guid><author>Wendell_0</author><pubDate>Fri, 29 Oct 2021 17:36:03 +0800</pubDate><description><![CDATA[条款05:了解C++默默编写并调用了哪些函数
@(EffectiveCpp)

如果你自己没声明，编译器就会为它声明（编译器版本的）一个copy构造函数，一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数，编译器也会声明一个default构造函数。
因此：

class Empty{};

等同于：
class Empty{
public:
    Empty(){...}//default构造函数
    Empty(const Empty&amp; rhs){...}//c]]></description><category></category></item><item><title><![CDATA[单例模式模板类]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120994169</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120994169</guid><author>Wendell_0</author><pubDate>Wed, 27 Oct 2021 15:31:24 +0800</pubDate><description><![CDATA[单例模式模板类
@(C/C++学习笔记)

模板类

#if defined(__SUPPORT_TS_ANNOTATION__) || defined(__clang__)
#define THREAD_ANNOTATION_ATTRIBUTE__(x)   __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x)   // no-op
#endif

#define GUARDED_BY(x) THREAD_ANNOTATION_]]></description><category></category></item><item><title><![CDATA[使用CMakeLists.txt和vscode的muduo环境设置]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120981475</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120981475</guid><author>Wendell_0</author><pubDate>Tue, 26 Oct 2021 21:21:50 +0800</pubDate><description><![CDATA[使用CMakeLists.txt的muduo环境设置
@(CMake笔记)
1、CMakeLists.txt
下面的编写方式可以通过cmake . -DCMAKE_BUILD_TYPE=Release或者cmake . -DCMAKE_BUILD_TYPE=Debug选择使用release模式生成的muduo还是debug模式生成的muduo。
#声明要求的cmake版本
cmake_minimum_required(VERSION 3.10)

# 工程名
project(setConfiugre)

#]]></description><category></category></item><item><title><![CDATA[CMake中的编译类型]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120924333</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120924333</guid><author>Wendell_0</author><pubDate>Sat, 23 Oct 2021 18:31:35 +0800</pubDate><description><![CDATA[CMake中的编译类型（Release  DebugRelease\;DebugReleaseDebug）
@(CMake笔记)

参考：Build types in CMake

一个编译类型[Build Type]意味着一系列在编译代码时用到的编译期设置。比如是否要进行优化，或者是否要包含调试信息。编译类型或者说编译模式[Build Mode]，又或者设置[confiuration]在VS中相当广泛，在VS中C++工程至少有两种编译类型：Release和DebugRelease和DebugRelease]]></description><category></category></item><item><title><![CDATA[s2017远程ubuntu18.04断点无法触发的问题]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120855934</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120855934</guid><author>Wendell_0</author><pubDate>Tue, 19 Oct 2021 22:02:27 +0800</pubDate><description><![CDATA[#20211019 vs2017远程ubuntu18.04断点无法触发的问题

文件名不要用中文。


]]></description><category></category></item><item><title><![CDATA[条款30 透彻了解`inline`的里里外外]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120670713</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120670713</guid><author>Wendell_0</author><pubDate>Sat, 09 Oct 2021 14:38:36 +0800</pubDate><description><![CDATA[20211009 条款30 透彻了解inline的里里外外
1 一开始不要设置inline，或将inline的使用范围限制在极其简短又十分平淡无奇的函数身上。

inline函数无法随程序库的升级而升级


比如 f是程序库内的一个inline函数，客户将“f函数本体”编进其程序中，一旦程序库设计者决定改变f，所有用到f的客户端程序都必须重新编译。然而如果f是non-inline函数，一旦它有任何修改，客户端只需重新连接就好，远比重新编译的负担少很多。如果程序库采取动态连接，升级版函数甚至可以不知不觉地被应]]></description><category></category></item><item><title><![CDATA[网络库缓冲区实践思路]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120555797</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120555797</guid><author>Wendell_0</author><pubDate>Wed, 29 Sep 2021 20:27:27 +0800</pubDate><description><![CDATA[网络库缓冲区实践思路
@(网络编程实现)
下面给出的是借鉴于muduo::Buffer的非阻塞I/O，TCP套接字的缓冲区设置。

关键字：


非阻塞网络、TCP、多连接、简单

为什么需要缓冲区

为什么需要输出缓冲区


受限于TCP协议，应用程序要发送的数据可能无法一次发送完成。在这种情况下，应用程序不可能阻塞在发送端口上。这就需要缓冲区暂时保存还未发送的数据，待套接字可写时再又网络库发送。


为什么需要输入缓冲区


应用程序只关心消息到达，而不关心数据到达；TCP协议是无消息边界的字节流协议。]]></description><category></category></item><item><title><![CDATA[TcpConnection的上下文]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/120350920</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/120350920</guid><author>Wendell_0</author><pubDate>Fri, 17 Sep 2021 15:56:50 +0800</pubDate><description><![CDATA[#20210917 TcpConnection的上下文
如有问题，欢迎交流！
上下文

相关API:


void TcpConnection::setContext(const boost::any&amp;  context)
{context_ = context;}

boost::any* TcpConnection::getContext() const
{return context_}



解释：


用于记录本次和本次连接密切相关的信息


...]]></description><category></category></item><item><title><![CDATA[条款04：确定对象在使用前已被初始化]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119964097</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119964097</guid><author>Wendell_0</author><pubDate>Sat, 28 Aug 2021 09:46:29 +0800</pubDate><description><![CDATA[#条款04：确定对象在使用前已被初始化
如有问题，欢迎交流指正
永远在使用对象之前先将它初始化，特别是内置类型。

构造函数的初始化任务使用member initialization listmember\,initialization\, listmemberinitializationlist替换函数体中的赋值动作。



C++规定，对象的成员变量的初始化动作发生在进入构造函数函数体之前。
规定总是在初值列中给出所有成员变量，以免还得记住哪些成员变量无需初值。
如果类中存在多个构造函数，为避免初值列中]]></description><category></category></item><item><title><![CDATA[TCPServer Class源码阅读(muduo::net)]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119898826</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119898826</guid><author>Wendell_0</author><pubDate>Tue, 24 Aug 2021 21:12:27 +0800</pubDate><description><![CDATA[#TCPServer Class源码阅读(muduo::net)
跟着大佬走，走的就是快呀
TCPServer是服务器类，直接提供给用户使用，用户通过注册回调函数来实现业务逻辑。
数据成员

EventLoop* loop_


本TCPServer Class对象所属EventLoop对象


const string ipPort_


字符串类型的ip地址和端口号


cosnt string name_


名称，用于输出调试信息


std::unique_ptr&lt;Acceptor&gt; ]]></description><category></category></item><item><title><![CDATA[EventLoopThreadPool Class源码阅读（muduo::net）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119896372</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119896372</guid><author>Wendell_0</author><pubDate>Tue, 24 Aug 2021 18:38:11 +0800</pubDate><description><![CDATA[#EventLoopThreadPool Class`源码阅读（muduo::net）
如果有问题，欢迎交流！！！
数据成员

EventLoop* baseLoop_


EventLoopTreadPool Class对象所在loop。有些成员函数在执行前要检查当前是不是在baseLoop_所在线程


string name_


用于给一众EventLoopThread命名


int numThreads_


创建的线程数量


next_


下一个EventLoop对象


std::vec]]></description><category></category></item><item><title><![CDATA[EventLoopThread源码阅读（muduo::net）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119893402</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119893402</guid><author>Wendell_0</author><pubDate>Tue, 24 Aug 2021 16:39:30 +0800</pubDate><description><![CDATA[#20210824 EventLoopThread源码阅读（muduo::net）
如果有问题，欢迎交流！！！
EventLoopThread Class创建一个线程执行loop()循环，并返回该EventLoop对象的地址。EventLoopThread Class控制其创建的线程和loop()循环的生命期。
数据成员

EventLoop* loop_


本EventLoopThread Class所创建的EventLoop对象所在的地址


bool exiting_


初始化为false,析构函]]></description><category></category></item><item><title><![CDATA[InetAddress Class源码阅读（muduo::net）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119105594</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119105594</guid><author>Wendell_0</author><pubDate>Mon, 26 Jul 2021 11:15:43 +0800</pubDate><description><![CDATA[InetAddress Class源码阅读（muduo::net）
如果有问题，欢迎交流
对网络地址的封装。
数据成员

union{stuct sockaddr_in addr_;struct sockaddr_in6 addr6_;}


也就是说，对于一个InetAddress Class类型的对象来说，它既可以是一个ipv4,也可以是一个ipv6。反正大多数基本api输入的参数都要sockaddr,然后自己检查类型。我们可以先获取addr_,然后再根据sin_family做最终确定。就像socket]]></description><category></category></item><item><title><![CDATA[Socket Class源码阅读（muduo::net）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119105224</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119105224</guid><author>Wendell_0</author><pubDate>Mon, 26 Jul 2021 11:02:57 +0800</pubDate><description><![CDATA[Socket Class源码阅读（muduo::net）
如果有问题，欢迎交流指正！！！
基于RAIIRAIIRAII机制对套接字的封装。
数据成员

const int sockfd_


在构造函数中初始化（拷贝初始化，不涉及调用socket(2)的操作）,在析构函数中关闭。

函数成员

int fd()


返回套接字


bool getTcpInfo(struct tcp_info* tcpi)


调用getsockopt获取套接字的信息


bool getTcpInfoString(cha]]></description><category></category></item><item><title><![CDATA[InetAddress Class源码阅读（muduo::net）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119063648</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119063648</guid><author>Wendell_0</author><pubDate>Sat, 24 Jul 2021 20:43:18 +0800</pubDate><description><![CDATA[InetAddress Class源码阅读（muduo::net）
如果有问题，欢迎交流！！！
对网络地址的封装。
数据成员

union{stuct sockaddr_in addr_;struct sockaddr_in6 addr6_;}


也就是说，对于一个InetAddress Class类型的对象来说，它既可以是一个ipv4,也可以是一个ipv6。反正大多数基本api输入的参数都要sockaddr,然后自己检查类型。我们可以先获取addr_,然后再根据sin_family做最终确定。就像soc]]></description><category></category></item><item><title><![CDATA[sockets namespace源码阅读（muduo::net::SocketsOps）]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/119062903</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/119062903</guid><author>Wendell_0</author><pubDate>Sat, 24 Jul 2021 19:38:07 +0800</pubDate><description><![CDATA[sockets namespace源码阅读（muduo::net）
@(Linux多线程服务端编程：使用muduoC++网络库读书笔记)
对套接字基本api比如connect、bind、listen等的封装。还有一些负责类型转换的函数。

sockaddr* sockaddr_cast


一系列的重载还是，负责将输入的或是sockaddr_in,或是sockaddr_in6类型的地址调用隐式类型转换转换为sockaddr。


sockaddr_in* sockaddr_in_cast


负责将sock]]></description><category></category></item><item><title><![CDATA[Timestamp Class源码阅读]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/118854205</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/118854205</guid><author>Wendell_0</author><pubDate>Sat, 17 Jul 2021 11:23:33 +0800</pubDate><description><![CDATA[Timestamp Class源码阅读
如有问题，欢迎交流！！！
微秒精度的epoch时间。只有一个数据成员，就是这个时间，然后围绕这个时间提供了一系列功能。这个epoch时间计算的是以1970年为基准的时间，主要由定时器调用，所以不必担心数值过大的问题。
数据成员

microSecondsSinceEpoch_


这就是那个微妙时间，只有这一个数据成员。在构造函数中初始化。

函数成员
该函数外，重载了相关的比较运算符。

string toString()


将微秒时间转换为字符串类型的秒


s]]></description><category></category></item><item><title><![CDATA[BoundedBlockingQueue Class源码阅读(muduo/base)]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/118823016</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/118823016</guid><author>Wendell_0</author><pubDate>Fri, 16 Jul 2021 20:56:40 +0800</pubDate><description><![CDATA[BoundedBlockingQueue Class源码阅读(muduo/base)
如果有问题，欢迎交流！！！
阻塞队列模板类的有限版本，其队列大小在构造函数中被初始化，并定义了用于判断队列空或满的函数，而且其队列大小确定后不能改变。
数据成员

template&lt;typename T&gt;
boost::circular_buffer&lt;T&gt; queue_


队列，但这个类型是什么？
一个环状的缓冲区


Condition notEmpty_


条件变量，用于通知队列非空


C]]></description><category></category></item><item><title><![CDATA[BlockingQueue Class源码阅读]]></title><link>https://blog.youkuaiyun.com/Wendell_0/article/details/118822271</link><guid>https://blog.youkuaiyun.com/Wendell_0/article/details/118822271</guid><author>Wendell_0</author><pubDate>Fri, 16 Jul 2021 20:43:40 +0800</pubDate><description><![CDATA[BlockingQueue Class源码阅读
如果有问题，欢迎交流！！！
阻塞队列，干嘛的？BlockingQueue Class是一个模板类，会将类型为T的对象保存，或弹出。
用来干嘛？
数据成员

template&lt;typename T&gt;
Condition notEmpty_


条件变量，用于通知阻塞线程，队列非空。因为这个队列大小是不设限制的，所以不需要额外的条件变量通知线程已满。


std::deque&lt;T&gt; queue_


保存类型为T的对象的队列


mutab]]></description><category></category></item></channel></rss>