<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[risen__的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/risen__</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; risen__]]></copyright><item><title><![CDATA[nginx源码分析-4]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/135311119</link><guid>https://blog.youkuaiyun.com/risen__/article/details/135311119</guid><author>risen__</author><pubDate>Tue, 02 Jan 2024 00:17:18 +0800</pubDate><description><![CDATA[ngx_module_t：一个结构体，用于描述nginx中的各个模块，其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数，以便nginx在运行时能够正确地加载和管理这些模块。nginx中有几大类主要模块，分别是core、http、event、mail、stream。这一章内容讲述nginx的模块化。]]></description><category></category></item><item><title><![CDATA[nginx源码分析-3]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/135299998</link><guid>https://blog.youkuaiyun.com/risen__/article/details/135299998</guid><author>risen__</author><pubDate>Sat, 30 Dec 2023 00:11:17 +0800</pubDate><description><![CDATA[这一章内容讲述nginx中的事件是如何一步步添加到epoll实例中的。]]></description><category></category></item><item><title><![CDATA[nginx源码分析-2]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/135255715</link><guid>https://blog.youkuaiyun.com/risen__/article/details/135255715</guid><author>risen__</author><pubDate>Thu, 28 Dec 2023 00:32:27 +0800</pubDate><description><![CDATA[ngx_worker_process_cycle：nginx工作进程的主循环，负责创建共享内存、设置信号处理、进入事件循环、处理定时器、处理连接和请求、关闭连接和资源清理。ngx_cycle_s结构体是nginx中非常重要的结构体之一，它代表了nginx运行时的环境。在nginx的生命周期中用于保存各种与运行时状态相关的信息。ngx_spawn_process用于创建新的进程，用于启动子进程来处理网络连接、缓存刷新、日志切割等任务。]]></description><category></category></item><item><title><![CDATA[nginx源码分析-1]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/135233211</link><guid>https://blog.youkuaiyun.com/risen__/article/details/135233211</guid><author>risen__</author><pubDate>Wed, 27 Dec 2023 20:52:18 +0800</pubDate><description><![CDATA[gdb attach nginx的work线程。]]></description><category></category></item><item><title><![CDATA[变量名前加下划线]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/122068431</link><guid>https://blog.youkuaiyun.com/risen__/article/details/122068431</guid><author>risen__</author><pubDate>Tue, 21 Dec 2021 16:53:25 +0800</pubDate><description><![CDATA[在C语言中，
以单下划线（_）表明是标准库的变量，
双下划线（__） 开头表明是编译器的变量。

]]></description><category></category></item><item><title><![CDATA[libevent_Linux编译问题]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/121874852</link><guid>https://blog.youkuaiyun.com/risen__/article/details/121874852</guid><author>risen__</author><pubDate>Sat, 11 Dec 2021 15:59:26 +0800</pubDate><description><![CDATA[按照官网编译可能会报错：
CMake Error at /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message):
  Could NOT find MbedTLS (missing: MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY
  MBEDTLS_CRYPTO_LIBRARY MBEDTLS_X509_LIBRARY MBEDTLS_LIBRARIES
  MBEDTLS_VE]]></description><category></category></item><item><title><![CDATA[《Linux高性能服务器编程》IO单元（9~12章）]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/121859707</link><guid>https://blog.youkuaiyun.com/risen__/article/details/121859707</guid><author>risen__</author><pubDate>Fri, 10 Dec 2021 16:39:37 +0800</pubDate><description><![CDATA[github地址
第9章 IO复用
IO复用使得程序能同时监听多个文件描述符，这对提高程序的性能至关重要。需要指出的是，IO复用虽然能同时监听多个文件描述符，但它本身是阻塞的。并且当多个文件描述符同时就绪时，如果不采取额外的措施，程序就只能按顺序依次处理其中的每一个文件描述符，这使得服务器程序看起来像是串行工作的。如果要实现并发，只能使用多进程或多线程等编程手段。
select系统调用的用途是：在一段指定时间内，监听用户感兴趣的文件描述符上的可读、可写和异常等事件。
poll系统调用和select类似，也是]]></description><category></category></item><item><title><![CDATA[《Linux高性能服务器编程》高性能服务器程序框架（8章）]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/121810395</link><guid>https://blog.youkuaiyun.com/risen__/article/details/121810395</guid><author>risen__</author><pubDate>Thu, 09 Dec 2021 11:44:03 +0800</pubDate><description><![CDATA[第8章 高性能服务器程序框架
服务器模型

C/S模型：C/S模型的逻辑很简单。服务器启动后，首先创建一个（或多个）监听socket，并调用bind函数将其绑定到服务器感兴趣的端口上，然后调用listen函数等待客户连接。服务器稳定运行之后，客户端就可以调用connect函数向服务器发起连接。由于客户连接请求是随即到达的异步事件，服务器需要使用某种I/O模型来监听这一事件，比如select系统调用。当监听到连接请求后，服务器就调用accept函数接受它，并分配一个逻辑单元为新的连接服务。逻辑单元可以是新创建]]></description><category></category></item><item><title><![CDATA[《Linux高性能服务器编程》Linux网络编程基础API（5~7章）]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/121805614</link><guid>https://blog.youkuaiyun.com/risen__/article/details/121805614</guid><author>risen__</author><pubDate>Thu, 09 Dec 2021 08:59:22 +0800</pubDate><description><![CDATA[github地址
第5章 Linux网络编程基础API
socket地址API
字节序分为大端字节序和小端字节序。大端字节序是指一个整数的高位字节存储在内存的低地址处，低位字节存储在内存的高地址处。小端字节序则是指整数的高位字节存储在内存的高地址处，而低位字节则存储在内存的低地址处。
现代PC大多采用小端字节序，因此小端字节序又被称为主机字节序。发送端总是把要发送的数据转化为大端字节序数据后再发送，而接收端知道对方传送过来的数据总是采用大端字节序，所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行]]></description><category></category></item><item><title><![CDATA[《Linux高性能服务器编程》网络协议（1~4章）]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/121769841</link><guid>https://blog.youkuaiyun.com/risen__/article/details/121769841</guid><author>risen__</author><pubDate>Tue, 07 Dec 2021 15:17:10 +0800</pubDate><description><![CDATA[github地址
第一章 TCP/IP协议族
TCP/IP协议族是一个四层协议系统，自底而上分别是数据链路层、网络层、传输层和应用层。
数据链路层
ARP协议（Address Resolve Protocol，地址解析协议）：网络层使用IP地址寻址一台机器，而数据链路层使用物理地址寻址一台机器，因此网络层必须先将目标机器的IP地址转化成其物理地址，才能使用数据链路层提供的服务，这就是ARP协议的用途。
RARP协议（Reverse Address Resolve Protocol，逆地址解析协议）：RARP]]></description><category></category></item><item><title><![CDATA[leveldb编译]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/120772986</link><guid>https://blog.youkuaiyun.com/risen__/article/details/120772986</guid><author>risen__</author><pubDate>Thu, 14 Oct 2021 21:19:54 +0800</pubDate><description><![CDATA[这里主要讲linux上编译leveldb。
从github上clone的项目缺少googletest和benchmark子模块，需要自己到github上clone。
首先进入third_party目录，删掉两个空目录：
sudo rm -rf benchmark googletest

然后
git clone git@github.com:google/googletest.git
git clone git@github.com:google/benchmark.git

apt安装一个sqlite3
]]></description><category></category></item><item><title><![CDATA[两台linux服务器互传文件]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/120467698</link><guid>https://blog.youkuaiyun.com/risen__/article/details/120467698</guid><author>risen__</author><pubDate>Sat, 25 Sep 2021 09:44:24 +0800</pubDate><description><![CDATA[单个文件
sudo scp /home/t1.trace jacob@192.168.1.19:/home/jacob

文件夹
sudo scp -r /home/ jacob@192.168.1.19:/home/jacob

文件夹下所有文件
sudo scp /home/* jacob@192.168.1.19:/home/jacob

拷贝文件并重命名
sudo scp /home/t1.trace jacob@192.168.1.19:/home/jacob/t2.trace


...]]></description><category></category></item><item><title><![CDATA[如何定义一个只能在堆上（栈上）生成对象的类？]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/120437870</link><guid>https://blog.youkuaiyun.com/risen__/article/details/120437870</guid><author>risen__</author><pubDate>Thu, 23 Sep 2021 16:35:52 +0800</pubDate><description><![CDATA[只能在堆上
方法：将析构函数设置为私有
原因：C++ 是静态绑定语言，编译器管理栈上对象的生命周期，编译器在为类对象分配栈空间时，会先检查类的析构函数的访问性。若析构函数不可访问，则不能在栈上创建对象。
只能在栈上
方法：将 new 和 delete 重载为私有
原因：在堆上生成对象，使用 new 关键词操作，其过程分为两阶段：第一阶段，使用 new 在堆上寻找可用内存，分配给对象；第二阶段，调用构造函数生成对象。将 new 操作设置为私有，那么第一阶段就无法完成，就不能够在堆上生成对象。
参考：https]]></description><category></category></item><item><title><![CDATA[C++虚基类]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/120437321</link><guid>https://blog.youkuaiyun.com/risen__/article/details/120437321</guid><author>risen__</author><pubDate>Thu, 23 Sep 2021 16:34:16 +0800</pubDate><description><![CDATA[虚基类中带有纯虚函数，而带有纯虚函数的类也叫抽象类。
抽象类被继承后，子类可以继续是抽象类，也可以是普通类。
虚基类如果被继承，那么子类就必须实现虚基类里面的所有纯虚函数，其子类不能是抽象类。

...]]></description><category></category></item><item><title><![CDATA[linux进程被killed如何查看日志？]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/120434967</link><guid>https://blog.youkuaiyun.com/risen__/article/details/120434967</guid><author>risen__</author><pubDate>Thu, 23 Sep 2021 14:57:13 +0800</pubDate><description><![CDATA[使用命令
dmesg | egrep -i -B100 'killed process'


]]></description><category></category></item><item><title><![CDATA[APUE第三版源码使用]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/119813058</link><guid>https://blog.youkuaiyun.com/risen__/article/details/119813058</guid><author>risen__</author><pubDate>Thu, 19 Aug 2021 23:08:03 +0800</pubDate><description><![CDATA[1. 找不到major minor
解决方法：在devrdev.c文件中#include &lt;sys/sysmacros.h&gt;
2. #define _flag __pad[4]报错
解决方法：将下面的代码修改成：

3./usr/bin/ld: cannot find -lbsd
解决方法：在Linux上：apt-get install libbsd-dev

...]]></description><category></category></item><item><title><![CDATA[数字图像处理复习（4-5）]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/118636355</link><guid>https://blog.youkuaiyun.com/risen__/article/details/118636355</guid><author>risen__</author><pubDate>Sat, 10 Jul 2021 16:23:30 +0800</pubDate><description><![CDATA[第四第五章的内容很多，编程不必自己造轮子，写笔记也一样（狗头警告）。
#ifdef REVIEW

第4章 频率域滤波
第一篇博客讲频率域滤波的数学基础，第二篇讲频率域滤波。
https://blog.youkuaiyun.com/weixin_35732969/article/details/82918421
https://blog.youkuaiyun.com/weixin_35732969/article/details/82948853?spm=1001.2014.3001.5501
第5章 图像复原与重建
按顺序，第一]]></description><category></category></item><item><title><![CDATA[前端初期学习资源]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/118365166</link><guid>https://blog.youkuaiyun.com/risen__/article/details/118365166</guid><author>risen__</author><pubDate>Wed, 30 Jun 2021 17:37:56 +0800</pubDate><description><![CDATA[前端初期学习资源
1 先来一个高屋建瓴：
React.js,Angular.js,Vue.js学习哪个好？
2 初期学习：
这个回答讲了前期的学习顺序，可以按它的方式学。
也可以看看阿里巴巴的前端学习路线，是视频教学。
前期学完之后就可以选一个框架深耕。
3 技术路线：

这个图片来自：
https://github.com/adam-golab/react-developer-roadmap/blob/master/README-CN.md
Vue和Angular的知识图谱也与此类似。
4 道听途说


]]></description><category></category></item><item><title><![CDATA[C++内存模型]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/118229429</link><guid>https://blog.youkuaiyun.com/risen__/article/details/118229429</guid><author>risen__</author><pubDate>Fri, 25 Jun 2021 22:03:01 +0800</pubDate><description><![CDATA[头文件中常包含的内容：

函数原型
使用#define或const定义的符号常量
结构声明
类声明
模板声明
内联函数

不同的编译器名称修饰的方式可能不同，可能为同一个函数生成不同的修饰名称。名称的不同将使链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配。在链接编译模块时，请确保所有对象文件或库都是由同一个编译器生成的。如果有源代码，通常可以用自己的编译器重新编译源代码来消除链接错误。
存储持续性、作用域和链接性
C++使用不同的方案来存储数据：

自动存储持续性
静态存储持续性
线程]]></description><category></category></item><item><title><![CDATA[C++函数相关]]></title><link>https://blog.youkuaiyun.com/risen__/article/details/118212791</link><guid>https://blog.youkuaiyun.com/risen__/article/details/118212791</guid><author>risen__</author><pubDate>Fri, 25 Jun 2021 11:24:35 +0800</pubDate><description><![CDATA[程序编译之后的最终产品是可执行程序——由一组机器语言指令组成。运行程序时，操作系统将这些指令载入到计算机内存中，因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。
执行到函数调用指令时，程序将在函数调用后立即存储该指令的内存地址，并将函数参数复制到堆栈，跳到标记函数起点的内存单元，执行函数代码，然后跳回到地址被保存的指令处。
内联函数
使用内联函数时，编译器将使用相应的函数代码替换函数调用，如果程序在10个不同的地方调用同一个内联函数，则该程序将包含该函数代码的10个副本。内联函数的运行速度比常]]></description><category></category></item></channel></rss>