<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[makesifriend的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/makesifriend</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; makesifriend]]></copyright><item><title><![CDATA[redis中epoll事件怎样与读写回调函数绑定]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/92800597</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/92800597</guid><author>makesifriend</author><pubDate>Wed, 19 Jun 2019 09:36:48 +0800</pubDate><description><![CDATA[epoll多路分离机制虽然以数组的形式返回所有激活事件的fd及属性（读写），但没有指定对每个事件的操作。事实上，如果需要读写不同激活的fd，只能根据fd、属性来再次判断自己操作的是哪一个事件。在读操作的执行函数一致、写操作的执行函数一致时，这种做法是可行的。但如果读或写操作属性的事件具有不同的执行函数，就不能单纯根据事件的属性决定执行函数了。为了解决这个问题，redis提供了读写回调函数与注册事件...]]></description><category></category></item><item><title><![CDATA[redis的rehash工作原理]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/92689343</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/92689343</guid><author>makesifriend</author><pubDate>Tue, 18 Jun 2019 09:38:44 +0800</pubDate><description><![CDATA[在redis中，键值以哈西表的方式进行存储，在键值对的数目比较多时，哈西值冲突的次数就会变多，这会降低检索效率。为了减少哈西表中的地址冲突次数，redis会增加键值空间，重新定义键值对的映射地址，也就是进行所谓的rehash。本文主要通过redis源码分析rehash原理。主要解决如下几个问题。

1，redis中hash表的数据结构是怎样的？

2，什么时候开始进行rehash？

3，怎样为扩...]]></description><category></category></item><item><title><![CDATA[redis客户端连接到服务器的步骤]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/90376262</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/90376262</guid><author>makesifriend</author><pubDate>Mon, 20 May 2019 17:39:25 +0800</pubDate><description><![CDATA[看了大约3天的redis-cli了，是进行总结的时候了。

和大多数客户端连接到服务器一样，redis-cli连接到服务器也主要分为两个阶段，请求连接阶段和数据传送阶段。具体来讲redis-cli做的事情有：

1、以socket方式建立连接；

2，选择相应的数据库；

3，对客户端发送的命令进行编码；

4，发送客户端编码的数据（write）；

5，接收服务器回应的数据（read）；

6，...]]></description><category></category></item><item><title><![CDATA[redis下的字符串分割函数]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/90369112</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/90369112</guid><author>makesifriend</author><pubDate>Mon, 20 May 2019 10:03:16 +0800</pubDate><description><![CDATA[在看redis-cli.c的时候，遇到了字符串分割函数sdssplitargs，我想不就是字符串分割函数吗，我也会写，我到要看看自己写的东西与标准有何不同。

一个用C语言写的字符串分割函数需要考虑哪些问题呢？

1，分割的字符串用啥存储呢？答案是二重指针，相当于一个字符串数组；

2，使用啥函数解决从源字符串复制到新开辟的指针所指向的空间呢？strncpy；

3，函数的逻辑问题？嗯，如果遇到‘...]]></description><category></category></item><item><title><![CDATA[认识linenoise]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/90315829</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/90315829</guid><author>makesifriend</author><pubDate>Sat, 18 May 2019 16:32:02 +0800</pubDate><description><![CDATA[在学习redis的client源码的过程中，遇到了linenoise这个函数，知道它是一个处理命令的工具，但它具体能做什么工作，怎样作这些工作还是不清楚。通过查看相关资料，对linenoise的功能及部分使用方法有了初步的认识，下面就让我介绍一下：

1，linenoise是个处理指令的交互窗口

在redis中，linenoise用在client中，就像是一个交互窗口，在这个窗口中，可以输入指令...]]></description><category></category></item><item><title><![CDATA[C语言文件读写]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/85638122</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/85638122</guid><author>makesifriend</author><pubDate>Wed, 02 Jan 2019 20:31:05 +0800</pubDate><description><![CDATA[在C语言中，文件的表示符号是整数型的，所以可以通过int定义文件。

open

可以通过open函数将具体的一个文件与文件描述符连接起来，其中read函数在fcntl.h中定义，如下：


int open(const char *path, int oflag, ...);

在使用open函数读写时，要首先确定文件的属性，比如后续操作文件时的属性（可写，可读，可追加，可创建）。

还需要定义...]]></description><category></category></item><item><title><![CDATA[Linux制作动态库]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84892011</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84892011</guid><author>makesifriend</author><pubDate>Sat, 08 Dec 2018 14:21:42 +0800</pubDate><description><![CDATA[参考文章：

https://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html

步骤：

1，编写源文件

2，编写接口文件

3，生成动态库

4，生成可执行文件

5，添加可以执行文件运行库查找路径

 

一、编写源文件

相当于函数定义


int max(int n1, int n2, int n3)
{
	int max...]]></description><category></category></item><item><title><![CDATA[C++的异常检测方法（以文件读取为例）]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84847084</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84847084</guid><author>makesifriend</author><pubDate>Thu, 06 Dec 2018 10:00:41 +0800</pubDate><description><![CDATA[关于C++的异常检测的关键字主要有3个，分别是throw，try，catch。它们的作用如下：

throw用于抛出错误，throw invalid_argument("can't open file");

try用于尝试执行含有抛出错误的代码；

catch用于捕获对应类型的错误对象，catch (invalid_argument&amp; e)，由于包含在&lt;stdexcept&gt;中...]]></description><category></category></item><item><title><![CDATA[按空格和按换行从文件中提取数据]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84837343</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84837343</guid><author>makesifriend</author><pubDate>Wed, 05 Dec 2018 16:18:46 +0800</pubDate><description><![CDATA[1，读取文件的类为ifstream，其中“i”代表“in”，针对变量而言，ifstream所在的头文件为fstream；

2，ifstream中有open方法，可以打开文件；

3，ifstream中有&amp;gt;&amp;gt;方法，可以以空格为分割符，以换行为结束符读取数据；

4，iostream中有getline(ifst, strline)方法，可以读取每一行的字符串数据。

 

以空格为分割符...]]></description><category></category></item><item><title><![CDATA[通过pkg-config添加libs和include]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84797995</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84797995</guid><author>makesifriend</author><pubDate>Tue, 04 Dec 2018 21:53:18 +0800</pubDate><description><![CDATA[首先介绍命令行编译C++项目的方法，指出其问题所在。

g++的生成可执行文件语法：

g++ -o test test.c -I/home/include -pthread -L/usr/local/lib -llog4cpp

其中，

1，-I后表示要搜索的头文件的路径，系统默认的搜索路径包括/usr/include、/usr/local/include。添加了/home/include后，...]]></description><category></category></item><item><title><![CDATA[为对象动态分配内存]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84784782</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84784782</guid><author>makesifriend</author><pubDate>Tue, 04 Dec 2018 11:18:43 +0800</pubDate><description><![CDATA[如果类中的数据成员含有指针变量，就需要为指针变量分配动态内存。（通常在编程中，应该尽量避免使用指针，应该用容器替代指针）

在本例中，使用二重指针，可以视为一个二维数组，不过该数组的元素个数可变。

如下为为指针分配空间的构造函数;


//构造函数，创建一个可以指定长度和高度的二维数组
SpreadSheet::SpreadSheet(int height, int length)
{
	mCe...]]></description><category></category></item><item><title><![CDATA[对象的复制和赋值]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84777889</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84777889</guid><author>makesifriend</author><pubDate>Mon, 03 Dec 2018 19:40:34 +0800</pubDate><description><![CDATA[对象的复制是在对象声明时进行的操作，而赋值是在声明之后的操作。一般而言，复制的语法为A a（b），A为类，b为已经定义的对象，a为复制b的对象;赋值的语法为A a;a = b；需要先声明对象a，之后再对其进行赋值。

有一种特殊的情况，A a=b;虽然是使用了操作符=，但由于是在对象声明时，进行定义，所以依然调用复制方法。

下面代码为对象的复制和赋值操作。


#include &amp;lt;iost...]]></description><category></category></item><item><title><![CDATA[对虚函数的认识]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/84491645</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/84491645</guid><author>makesifriend</author><pubDate>Sun, 25 Nov 2018 15:26:45 +0800</pubDate><description><![CDATA[可以在继承类中重写父类的方法，关键字是virtual。

如下代码所示，父类是Super，继承类是Sub，在Sub中，重写了Super的go()方法。


#include &amp;lt;iostream&amp;gt;
using namespace std;

class Super
{
	public :
		virtual void go() 
		{
			cout &amp;lt;&amp;lt; &quot;go() ca...]]></description><category></category></item><item><title><![CDATA[strtok函数的使用]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/80675898</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/80675898</guid><author>makesifriend</author><pubDate>Wed, 13 Jun 2018 11:36:42 +0800</pubDate><description><![CDATA[函数形式：

#include &lt;string.h&gt;
char *strtok(char *str, const char *delim);

作用：

根据某个定界附，将字符串分解成多个部分。

方法：

 第一次调用该函数时，输入为str，后面再调用该函数时，str为NULL。当分解完成后，函数返回NULL。

一个分解字符串，并记录分解次数的例子：
...]]></description><category></category></item><item><title><![CDATA[字符串二重指针为什么需要动态分配空间]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/80663906</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/80663906</guid><author>makesifriend</author><pubDate>Wed, 13 Jun 2018 10:14:23 +0800</pubDate><description><![CDATA[指针的概念：创建一个指针类型的数据，在64位系统中，一个指针类型的数据用8个字节表示。指针类型的数据存储某个数据的地址。编译器，可以根据指针地址处理该地址的数据。

问题：字符串指针是指向字符串的指针，初始化字符串指针时，不需要为该字符串指针分配内存；而初始化字符串二重指针时，却需要用malloc为二重指针分配内存?

一重字符串指针

首先考虑字符串的存储模型，如下图所示。字符串变量s其实是存储...]]></description><category></category></item><item><title><![CDATA[从一个加减法运算代码理解特殊运算符的重载]]></title><link>https://blog.youkuaiyun.com/makesifriend/article/details/78649806</link><guid>https://blog.youkuaiyun.com/makesifriend/article/details/78649806</guid><author>makesifriend</author><pubDate>Wed, 29 Nov 2017 15:55:15 +0800</pubDate><description><![CDATA[class wow():
    def __init__(s,x):
        s.x = x
    def __add__(s,y):
        return wow(s.x+y.x)
    def __sub__(s,y):
        return wow(s.x-y.x)
    def __repr__(s):
        return str(s.x)
a=wo]]></description><category></category></item></channel></rss>