<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ciaiy的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ciaiy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ciaiy]]></copyright><item><title><![CDATA[CentOS部署RocketMQ]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/108772516</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/108772516</guid><author>ciaiy</author><pubDate>Thu, 24 Sep 2020 13:38:48 +0800</pubDate><description><![CDATA[Centos安装RocketMQ

最近学弟学妹在做项目的时候，想使用RocketMQ, 但是阿里云的价格实在太高了，因此只能自己去部署下MQ了。
后期将rocketMQ-client-cpp的学习笔记也会记录下来。
下面为安装流程：


安装jdk
yum install java
yum -y install java-1.8.0-openjdk*



安装git
yum install git



下载源代码包
wget ’https://mirrors.tuna.tsinghua.edu.cn/]]></description><category></category></item><item><title><![CDATA[面试笔记]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/107503917</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/107503917</guid><author>ciaiy</author><pubDate>Wed, 22 Jul 2020 08:40:43 +0800</pubDate><description><![CDATA[#c++ 面试知识点总结
11-21


虚函数表
用于多态， 在每个类的内存最开始地方， 都有一个虚函数表， 存放着虚函数指针，[父类虚函数]，[子类虚函数]
若子类实现了父类虚函数， 则直接替代掉父类虚函数的数据。
若没加vitrual， 则要看具体是什么类型进行调用该函数的， 父类指针调用父函数， 子类指针调用子函数
#include &lt;iostream&gt;

using namespace std;

class A {
    public :
        virtual void ]]></description><category></category></item><item><title><![CDATA[Linux监控文件读写]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/97272978</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/97272978</guid><author>ciaiy</author><pubDate>Thu, 25 Jul 2019 17:18:34 +0800</pubDate><description><![CDATA[前言
最近想写deepin编程比赛中的文件管控系统。
如何去监测目标文件， 我思考了很久仍没有头绪，翻了翻开发大赛入围名单， 发现马艺诚同学使用了hook方法来监测进程操作目标文件。于是下午试了试， 确实可行（毕竟人家已经做出来了嘛）。下面讲解一下我下午尝试的read检测功能。
正文
废话不多说， 先贴代码。
#include &lt;stdio.h&gt;
#include &lt;string...]]></description><category></category></item><item><title><![CDATA[Muduo源码：Poller类 + EpollPoller类详解]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/90742274</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/90742274</guid><author>ciaiy</author><pubDate>Sun, 02 Jun 2019 19:16:01 +0800</pubDate><description><![CDATA[前言
最近开始看陈硕大佬的muduo, 在这里记下所学到的知识叭. 第一次写关于阅读源代码的博客, 可能更多的是通过注释的方式来解释作者的思路, 如果有任何的疑问或意见, 欢迎评论.
正文
Poller介绍
eventloop类中有一个成员叫做poller_, 这个poller_负责着所有的IO事件,  在整个eventloop中起到了决定性的作用.
  std::unique_ptr&lt;Po...]]></description><category></category></item><item><title><![CDATA[TCP 协议中的窗口管理]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/90303537</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/90303537</guid><author>ciaiy</author><pubDate>Sat, 18 May 2019 00:15:08 +0800</pubDate><description><![CDATA[交互式通信
在网络传输中, 有些数据包中的内容很多, 甚至和MSS的大小相同, 而有些数据包中的内容仅仅只有一字节. 所以数据包大小差异巨大. 若是数据过小的包太过于多的话, 就会造成网络利用率不高, 原因是要花费许多字节来构成TCP等协议头部.
在ssh中, 当我们敲下一个字符, 客户端获取输入信号, 马上就会传输给ssh服务器. 这也是网络质量优良时, 我们使用ssh几乎无延迟的原因了. 一个...]]></description><category></category></item><item><title><![CDATA[TCP 协议中的超时重传以及SACK选项]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/90186151</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/90186151</guid><author>ciaiy</author><pubDate>Tue, 14 May 2019 00:18:03 +0800</pubDate><description><![CDATA[TCP协议中的超时重传以及SACK选项
超时重传
RTO
发送者发送数据包后, 启动重传定时器, 重传定时器到期时所花费的时间.
RTT
一个数据包发送并确认所花费的时间.
关于计算RTO的算法
经典算法


首先计算一个平滑的RTT来设置为SRTT, 然后设置一个常量 alpha(称为平滑因子, 通常取值0.8)

(alpha *SRTT) + (1 - alpha)*RTT ==&gt; n...]]></description><category></category></item><item><title><![CDATA[myshell实现Sudo三部曲 : crypt函数和getpass函数]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/81364233</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/81364233</guid><author>ciaiy</author><pubDate>Thu, 02 Aug 2018 17:24:58 +0800</pubDate><description><![CDATA[上一章, 我们讲了如何获取加密密码,  现在我们要做的就是输入密码, 然后验证. 在这一部分, 我们要学习两个函数: crypt()和getpass()



crypt()

原型: char *crypt(const char *key, const char *salt);

key是要加密的信息(最多八字节), salt是加密的算法类型 和  扰动数据. 我们的密码就是用这种方式来加密的,...]]></description><category></category></item><item><title><![CDATA[myshell实现Sudo三部曲 : 阴影口令]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/81332348</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/81332348</guid><author>ciaiy</author><pubDate>Wed, 01 Aug 2018 17:07:47 +0800</pubDate><description><![CDATA[在上篇博客中,我们讲了设置用户位的作用, 有了seteuid这个函数, 我们就可以实现从普通用户权限转变为root权限. 但是我们的shell还需要密码验证模块. 要实现这个模块, 我们必须先得到用户密码.

在linux中, 有一个通常称为阴影口令(shadow password)的文件, 这个文件中包含这用户名和加密口令以及其他信息. 注意: 是加密口令, 没有哪个系统会随便到将密码明文存储....]]></description><category></category></item><item><title><![CDATA[myshell实现Sudo三部曲 : Linux更改用户ID]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/81297288</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/81297288</guid><author>ciaiy</author><pubDate>Tue, 31 Jul 2018 11:21:29 +0800</pubDate><description><![CDATA[前言 
在Linux系统中,特权和访问控制都是基于用户ID和组ID的. 当程序想要访问当前不允许访问的资源时, 它就需要改变用户ID或组ID. 使得新ID具有合适的特权或访问权限. 
在设计程序的时候, 我们应该使用最小特权模型, 最小特权模型表示, 我们程序应该只具有完成目的任务的最小特权.



三个用户ID


实际用户ID  
实际用户ID就是在用户登录时候, login()程序设置的, ...]]></description><category></category></item><item><title><![CDATA[Valgrind调试代码时的一些错误提示解析]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/81276155</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/81276155</guid><author>ciaiy</author><pubDate>Sun, 29 Jul 2018 22:46:10 +0800</pubDate><description><![CDATA[最近在写代码的时候, 发现了极其严重的内存泄漏. 卢神帮我找bug时, 使用了valgrind这个软件. Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具.  
下面解析一些常见的错误 : 


1. 



  ==3185== Use of uninitialised value of size 8  
  ==3185==    at 0x108602: main ...]]></description><category></category></item><item><title><![CDATA[linux 文件操作杂记]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/81270246</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/81270246</guid><author>ciaiy</author><pubDate>Sun, 29 Jul 2018 14:27:05 +0800</pubDate><description><![CDATA[文件操作杂记



在linux 学习中,文件操作是一个十分重要的模块. 
通常, 我们使用open()来打开文件.  其实在open()的背后, 有好多有(fu)趣(za)的事情发生. 
open()函数背后的系统调用相当复杂, 文章下面有链接, 可以详细理解. 
我们主要来讲一下文件描述符和文件之间不可描述的关系.



进程级别的文件描述符表
系统级别的打开文件表
硬件级别的文件系统
硬链接...]]></description><category></category></item><item><title><![CDATA[dup函数被人忽略的特性]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/80458588</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/80458588</guid><author>ciaiy</author><pubDate>Sat, 26 May 2018 01:35:12 +0800</pubDate><description><![CDATA[在学习进程通信的时候, 有个语句实在让人疑惑

/* 使用dup来重定向stdin程序片段 */
close(0);
dup(fd); // 两行代码完成了对stdin的重定向

我们都知道dup函数:int dup(int __fd), 他的返回值是当前可用文件描述符中最小数值. 
在上述代码中, 我们关闭了0这个文件描述符, 系统认为此时文件描述符的最小数值为0, 
 所以他会将dup()参数...]]></description><category></category></item><item><title><![CDATA[用C实现Linux shell]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/80445876</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/80445876</guid><author>ciaiy</author><pubDate>Fri, 25 May 2018 01:01:46 +0800</pubDate><description><![CDATA[学习了进程一章之后, 可以尝试着写一个自己的shell


程序目标
单个命令:   ls
带-l到多个参数的命令:   ls -l /temp
带一个输出重定向的命令: ls -l &amp;amp;gt; a
带一个输入重定向的命令: wc -c &amp;amp;lt; a
带一个管道命令: ls -l | wc -c
后台运行符可以添加到命令的最后面:   ls &amp;amp;amp;


整个程序逻辑很简单: 
输入-&amp;amp;gt;分析...]]></description><category></category></item><item><title><![CDATA[Linux僵尸进程和孤儿进程]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/79571619</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/79571619</guid><author>ciaiy</author><pubDate>Thu, 15 Mar 2018 18:22:24 +0800</pubDate><description><![CDATA[   程序运行到结尾的时候，有两种情况。子进程先退出，或者父进程先退出。
   如果父进程先退出的话，那么子进程就会变成孤儿进程，最后被init接管,我们来看一个例子。




#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main(void) {
    pid_t pid;

...]]></description><category></category></item><item><title><![CDATA[C语言静态变量初始化问题]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/79304120</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/79304120</guid><author>ciaiy</author><pubDate>Sat, 10 Feb 2018 12:45:45 +0800</pubDate><description><![CDATA[　　　　以前在学习Ｃ语言中，看到了这么一行代码:



    static int arr[100];

　　这是一行很正常的代码，但是我“细心”的发现作者在使用它的时候并没有初始化。书上的解释是，用static修饰的变量会自动初始化。 
　　为什么会被初始化呢？首先我们看一段话： 
可执行程序和内存映像的区别在于：可执行程序位于磁盘上，内存映像位于内存中，可执行程序没有堆栈，可执行程序虽然也有...]]></description><category></category></item><item><title><![CDATA[va_list简单介绍及初步实现printf函数]]></title><link>https://blog.youkuaiyun.com/ciaiy/article/details/78585936</link><guid>https://blog.youkuaiyun.com/ciaiy/article/details/78585936</guid><author>ciaiy</author><pubDate>Mon, 20 Nov 2017 21:56:18 +0800</pubDate><description><![CDATA[VA_LIST 是在C语言中解决变参问题的一组宏，所在头文件：#include ，用于获取不确定个数的参数。
C语言中的函数形参是从右向左压栈的，以此来保证栈顶是第一个参数

C语言中形参的这种存储结构使得我们可以用指针来寻找参数

用法：


首先在函数中定义一个va_list型的变量，这个变量指向参数的指针。
然后用va_start()初始化刚定义好的va_list变量
 ]]></description><category></category></item></channel></rss>