<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[vegeta852的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/vegeta852</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; vegeta852]]></copyright><item><title><![CDATA[第三方库设置内存管理函数hooks(libevent curl openssl protobuf-c sqlite)]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/114435643</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/114435643</guid><author>vegeta852</author><pubDate>Sat, 06 Mar 2021 11:09:53 +0800</pubDate><description><![CDATA[第三方库设置内存管理函数hooks(libevent curl openssl protobuf-c sqlite)
libevent
void event_set_mem_functions(void *(*malloc_fn)(size_t sz),
                             void *(*realloc_fn)(void *ptr, size_t sz),
                             void (*free_fn)(void *ptr))]]></description><category></category></item><item><title><![CDATA[内存泄漏，内存黑洞问题定位]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/114435226</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/114435226</guid><author>vegeta852</author><pubDate>Sat, 06 Mar 2021 10:49:05 +0800</pubDate><description><![CDATA[内存泄漏，内存黑洞问题定位
1. free查看内存概况
[root@VM_0_17_centos ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1883844      376664       76136         192     1431044     1311252
Swap:       1048572       30540     10]]></description><category></category></item><item><title><![CDATA[UNIX套接字“\0XXX“ 格式化抽象本地地址]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/114401662</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/114401662</guid><author>vegeta852</author><pubDate>Fri, 05 Mar 2021 16:30:28 +0800</pubDate><description><![CDATA[UNIX套接字"\0XXX" 格式化抽象本地地址
创建AF_UNIX unix套接字，路径名的第一个字节为空字节时，就可以让本地套接口地址成为了格式化抽象本地地址，在路径名中空字节之后的字节才会成为抽象名字的一部分。
int32_t sock = -1; 
int32_t one = 1;
sock = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
struct sockaddr_un addr = 
{
    .sun_family = AF_UNIX,]]></description><category></category></item><item><title><![CDATA[Lunix I/O总结]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/113527990</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/113527990</guid><author>vegeta852</author><pubDate>Mon, 01 Feb 2021 19:42:28 +0800</pubDate><description><![CDATA[Lunix I/O总结
文件概念：
定义：
文件：一组相关数据的有序集合。
文件名：这个数据集合的名称。
按类型分类：
常规文件
ASCII码文件 : ASCII 是可以用任何文字处理程序阅读的简单文本文件
二进制的文件: 图形文件及文字处理程序等计算机程序都属于二进制文件
由于很难严格区分文本文件和二进制文件的概念，所以我们可以简单地认为，如果一个文件专门用于存储文本字符的数据，没有包含字符以外的其他数据，我们就称之为文本文件，除此之外的文件就是二进制文件。
七种：bcd-lsp
b (block)：块设]]></description><category></category></item><item><title><![CDATA[sqlite3 多綫程/事務回滾/busy handler/簡單使用]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/112045557</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/112045557</guid><author>vegeta852</author><pubDate>Thu, 31 Dec 2020 18:23:20 +0800</pubDate><description><![CDATA[sqlite3 簡介及數據庫操作
简介
SQLite数据库是专门针对嵌入式开发的数据库软件，占用资源非常少（仅需几百K内存即可），处理速度快，而且可以直接使用C语言编程，同时也可以配合C#、PHP、Java等其他语言。SQLite诞生于2000年，2015年发布了新版本SQLite3，一经推出马上变成了最流行的嵌入式数据库软件。
//SQL中文翻译为“结构化查询语言”，是单词"Structured Query Language"的缩写。SQL是一种操作数据库的高级的非过程化编程语言，用户使用SQL命令通过D]]></description><category></category></item><item><title><![CDATA[protobuf-c 基本使用及样例]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/111935914</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/111935914</guid><author>vegeta852</author><pubDate>Tue, 29 Dec 2020 19:51:06 +0800</pubDate><description><![CDATA[protobuf-c 基本使用及样例
Protobuf简介
https://cloud.tencent.com/developer/article/1199069
一、数据类型照




proto类型
C/C++类型
proto类型
C/C++类型




double
double
float
float


int32
int32
int64
int64


uint32
uint32
uint64
uint64


sint32
int32
sint64
int64


fixed32
uint32]]></description><category></category></item><item><title><![CDATA[​json-c简介及基本使用]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/111923290</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/111923290</guid><author>vegeta852</author><pubDate>Tue, 29 Dec 2020 15:52:47 +0800</pubDate><description><![CDATA[​json-c简介及基本使用
JSON(JavaScript Object Notation) 是一种**轻量级的数据交换格式**。它基于ECMAScript的一个子集。 JSON选用完全独立于言语的文本格局，但是也使用了类似于C言语宗族的习气（包含C、C++、C#、Java、JavaScript、Perl、Python等）。这些特性使json调试成为抱负的数据交换言语。 易于人阅览和编写，同时也易于机器解析和生成(一般用于提高网络传输速率)。

JSON的格式
JSON 数据的书写格式是键（名称）/值对。]]></description><category></category></item><item><title><![CDATA[openssl 对称/非对称加密 AES CBC模式加解密]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/111484192</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/111484192</guid><author>vegeta852</author><pubDate>Mon, 21 Dec 2020 18:47:59 +0800</pubDate><description><![CDATA[openssl 对称/非对称加密 AES CBC模式加解密
对称加密: 在加密和解密过程中使用相同的密钥, 或是两个可以简单地相互推算的密钥的加密算法.
非对称加密: 也称为公开加密, 它需要一个密钥对, 一个是公钥, 一个是私钥, 一个负责加密, 一个负责解密.
对称加密在性能上要优于非对称加密, 但是安全性低于非对称加密.
主流的对称加密方式有 DES, AES. 这两种加密方式都属于分组加密, 先将明文分成多个等长的模块 ( block ), 然后进行加密.


DES 加密


AES 加密


非]]></description><category></category></item><item><title><![CDATA[Internet checksum 算法(Ip checksum)]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109853185</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109853185</guid><author>vegeta852</author><pubDate>Fri, 20 Nov 2020 16:20:37 +0800</pubDate><description><![CDATA[Internet checksum 算法(Ip checksum)
/*****************************************************************************
 * NAME: HeaderChecksum
 *
 * DESCRIPTION:
 *      this function calculates the header's checksum. it is
 *      exactly the Internet checksum ]]></description><category></category></item><item><title><![CDATA[那些年遇到的坑，rpmbuild]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109852161</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109852161</guid><author>vegeta852</author><pubDate>Fri, 20 Nov 2020 15:57:09 +0800</pubDate><description><![CDATA[rpm制作的包在安装之后发现二进制被压缩改变了，出现了缺少调试信息的现象；
gdb xxx
Reading symbols from xxx...(no debugging symbols found)...done.
编译时已经增加-g选项；且将编译后的二进制直接上传运行环境不会出现此现象，怀疑在rpm制作产生了问题;

经过调研，rpm制作时会strip二进制以达到减少文件大小的目的，此操作默认开启，导致调试信息被strip；
When we create an RPM using rpmbuild, ]]></description><category></category></item><item><title><![CDATA[限速算法基于令牌桶算法]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109580994</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109580994</guid><author>vegeta852</author><pubDate>Mon, 09 Nov 2020 16:48:14 +0800</pubDate><description><![CDATA[限速算法基于令牌桶算法
1）记最大速度单位为S，第一次发送开始时，记当前时间为T，记令牌桶初始化N=0, N最大值为2S，最小发送单位M=S/4，发送间隔I = 200ms
2）发送前记录当前时间为t，如果 S(t-T) + N &gt;= 2S, 令N = 2S， T = t ，发送M数据，休眠I时间
3）发送前记录当前时间为t, 如果 M &lt; S(t-T) + N &lt; 2S，则发送M数据，休眠I时间
4）发送前记录当前时间为t，如果 S(t-T) + N &lt; M, 则使N = N + ]]></description><category></category></item><item><title><![CDATA[那些年遇到的坑openssl线程安全问题]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109494495</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109494495</guid><author>vegeta852</author><pubDate>Wed, 04 Nov 2020 17:09:37 +0800</pubDate><description><![CDATA[那些年遇到的坑openssl线程安全问题
#5  0x00000000005a9fed in CRYPTO_free ()
No symbol table info available.
#6  0x00000000005d60f5 in engine_pkey_meths_free ()
No symbol table info available.
#7  0x00000000005d2d34 in engine_free_util ()
No symbol table info available.
]]></description><category></category></item><item><title><![CDATA[那些年遇到的坑不可重入函数inet_ntoa]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109494210</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109494210</guid><author>vegeta852</author><pubDate>Wed, 04 Nov 2020 17:00:39 +0800</pubDate><description><![CDATA[那些年遇到的坑不可重入函数inet_ntoa
inet_ntoa–不可重入函数
char *inet_ntoa(struct in_addr in);
The string is returned in a statically allocated buffer, which subsequent calls will overwrite.
    unsigned long n1 =  inet_addr("10.213.120.1");
	unsigned long n2 =  inet_addr("1]]></description><category></category></item><item><title><![CDATA[那些年遇到的坑---EPOLL（cpu100%/卡死）]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109493812</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109493812</guid><author>vegeta852</author><pubDate>Wed, 04 Nov 2020 16:47:43 +0800</pubDate><description><![CDATA[那些年遇到的坑—EPOLL（cpu100%/卡死）
最近在定位BUG时发现了这么一个问题
程序跑的设备上4个CPU只有一个CPU是跑满的状态，其他CPU的占用率都非常低，且此设备上几乎无业务。
通过火焰图定位是哪个模块出现问题之后，通过pstack 看看有问题的这个进程在干什么
pstack pid
#0  0x00007fbea3424d43 in epoll_wait () from /lib64/libc.so.6
通过pstack 可以看到，有大量的系统调用sys_epoll_wait占用了CPU
]]></description><category></category></item><item><title><![CDATA[性能分析工具：perf火焰图]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109449522</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109449522</guid><author>vegeta852</author><pubDate>Mon, 02 Nov 2020 15:14:26 +0800</pubDate><description><![CDATA[性能分析工具：perf火焰图
1.安装 perf: yum install -y perf
2.https://github.com/brendangregg/FlameGraph 拉取脚本
1.采样
perf record -C $cpu_num -e cpu-clock -o perf.data -g sleep 10
-C 指定cpu
-e cpu-clock 指perf record监控的指标为cpu周期
-o perf.data 信息收集文件名
-g 支持记录函数的调用关系

2.用perf sc]]></description><category></category></item><item><title><![CDATA[Linux 设置cpu亲和力（将进程/线程绑定不同core/cpu）]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109447698</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109447698</guid><author>vegeta852</author><pubDate>Mon, 02 Nov 2020 13:54:19 +0800</pubDate><description><![CDATA[Linux 设置cpu亲和力（将进程/线程绑定不同core/cpu）
进程绑定到CPU
#include &lt;sched.h&gt;

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

参数
pid：进程的id号，如果pid为0，则表示本进程

cpusetsiz]]></description><category></category></item><item><title><![CDATA[linux 编程中忽略SIGPIPE信号]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109445219</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109445219</guid><author>vegeta852</author><pubDate>Mon, 02 Nov 2020 11:15:07 +0800</pubDate><description><![CDATA[linux 编程中忽略SIGPIPE信号
SIGPIPE
简单来说，就是客户端程序向服务器端程序发送了消息，然后关闭客户端，服务器端返回消息的时候就会收到内核给的SIGPIPE信号。
TCP的全双工信道其实是两条单工信道，client端调用close的时候，虽然本意是关闭两条信道，但是其实只能关闭它发送的那一条单工信道，还是可以接受数据，server端还是可以发送数据，并不知道client端已经完全关闭了。
以下为引用：
”’对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回]]></description><category></category></item><item><title><![CDATA[NDK安卓编译链安装]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109445021</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109445021</guid><author>vegeta852</author><pubDate>Mon, 02 Nov 2020 11:08:32 +0800</pubDate><description><![CDATA[NDK安卓编译链安装
网址：https://developer.android.com/ndk/downloads
选择Linux平台的，文档截止最新版本android-ndk-r19c-linux-x86_64.zip
放置到centos主机上
安装
mkdir -p /opt/android*tools/unzip -x android-ndk-r19c-linux-x86*64.zip -d /opt/android_tools/

在.bashrc添加以下语句
NDK=/opt/android*to]]></description><category></category></item><item><title><![CDATA[wireshark Lua脚本编写]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/109444903</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/109444903</guid><author>vegeta852</author><pubDate>Mon, 02 Nov 2020 11:03:36 +0800</pubDate><description><![CDATA[wireshark Lua脚本编写
Lua语言是脚本语言，只需要编写相关协议解析的脚本内容，然后由wireshark加载即可（Wireshark自带Lua解析器），wireshark封装丰富的接口给Lua使用，一些有用的docs：
https://www.wireshark.org/docs/wsdg_html_chunked/index.html
第十章：
10. Lua Support in Wireshark
第十一章：
11. Wireshark’s Lua API Reference Manual]]></description><category></category></item><item><title><![CDATA[Linux 守护进程启动过程]]></title><link>https://blog.youkuaiyun.com/vegeta852/article/details/107730282</link><guid>https://blog.youkuaiyun.com/vegeta852/article/details/107730282</guid><author>vegeta852</author><pubDate>Sat, 01 Aug 2020 14:22:44 +0800</pubDate><description><![CDATA[守护进程启动过程
/*****************************************************************************
 * fork daemon:
 * (https://github.com/pasce/daemon-skeleton-linux-c/)
 * (https://nullraum.net/how-to-create-a-daemon-in-c/)
 *
 * forking a daemon requires the follow]]></description><category></category></item></channel></rss>