<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[juggte的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/juggte</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; juggte]]></copyright><item><title><![CDATA[【Android JNI】 C/C++ 标准输入输出打印至Android日志控制台]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/139960442</link><guid>https://blog.youkuaiyun.com/juggte/article/details/139960442</guid><author>juggte</author><pubDate>Tue, 25 Jun 2024 15:30:58 +0800</pubDate><description><![CDATA[【代码】【Android JNI】 C/C++ 标准输入输出打印至Android日志控制台。]]></description><category></category></item><item><title><![CDATA[nginx 集群部署]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/126762851</link><guid>https://blog.youkuaiyun.com/juggte/article/details/126762851</guid><author>juggte</author><pubDate>Fri, 16 Sep 2022 00:14:11 +0800</pubDate><description><![CDATA[nginx在1.9版本前，只支持http协议web服务器的负载均衡，1.9版本开始以后，nginx开始支持tcp的长连接负载均衡，但是nginx默认并没有编译tcp负载均衡模块，编写它时，需要加入–with-stream参数来激活这个模块。普通的基于哈希的负载算法，并不能满足负载均衡所要求的单调性和平衡性，但一致性哈希算法非常好的保持了这两种特性，所以经常用在需要设计负载算法的应用场景当中。]]></description><category></category></item><item><title><![CDATA[socket编程 REUSEADDR/REUSESOCK 参数区别]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/126458348</link><guid>https://blog.youkuaiyun.com/juggte/article/details/126458348</guid><author>juggte</author><pubDate>Mon, 22 Aug 2022 03:21:04 +0800</pubDate><description><![CDATA[介绍一下系统调用 setsockopt 的REUSEADDR/REUSESOCK 参数区别。众所周知，TCP连接中主动断开连接方会进入一个TIME_WAIT 状态，并连接会等待两个MSL时间才真正断开，来防止最后一个发送的ACK丢失也能重发和让数据包在网络中消散。]]></description><category></category></item><item><title><![CDATA[ubuntu 操作杂项]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/126285021</link><guid>https://blog.youkuaiyun.com/juggte/article/details/126285021</guid><author>juggte</author><pubDate>Thu, 11 Aug 2022 14:46:35 +0800</pubDate><description><![CDATA[Ubuntu 18.04操作系统默认预装GCC 7.3版本，不过有时候在编译时是需要用不同gcc的版本，本文介绍怎样安装不同的gcc和g++，并设置根据不同的需要在不同版本之间转换。sudo update-alternatives --remove gcc /usr/bin/（为gcc版本号，比如gcc-4.5。这个命令输入过后，看不到java的版本了的话，就表示卸载成功了，如果，还能看到版本号，那一定是什么地方出了问题。同时输入同步时间命令。sudo update-grub，保存/更新GRUB文件。...]]></description><category></category></item><item><title><![CDATA[ubuntu安装zookeeper原生 C API]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/126283337</link><guid>https://blog.youkuaiyun.com/juggte/article/details/126283337</guid><author>juggte</author><pubDate>Thu, 11 Aug 2022 14:28:37 +0800</pubDate><description><![CDATA[zookeeper是一个在分布式环境中，为应用提供一致性协调服务的一种中间件。是Google的Chubby一个开源的实现，是大数据生态中的重要组件。zookeeper可以在分布式环境中监视各个节点的状态，并根据节点的状态进行下一步合理操作。，对外提供简单易用、高效、稳定的接口。...]]></description><category></category></item><item><title><![CDATA[CMake 快速指南]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/125777285</link><guid>https://blog.youkuaiyun.com/juggte/article/details/125777285</guid><author>juggte</author><pubDate>Thu, 14 Jul 2022 09:45:57 +0800</pubDate><description><![CDATA[CMake使用简单方便，可以跨平台，构建项目编译环境。尤其比直接写Makefile简单（在构建大型工程编译时，需要写大量的文件依赖关系），可以通过简单的CMake生成负责的Makefile文件。cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项，一个基本的CMakeLists.txt的配置 文件内容如下：

示例一
生成一个main.cpp源文件，输出"hello world"，然后在同级目录创建一个CMakeLists.txt文件，内容
如下：

保存退出，执行cmake .命令]]></description><category></category></item><item><title><![CDATA[Golang 快速上手 (3)]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/125382130</link><guid>https://blog.youkuaiyun.com/juggte/article/details/125382130</guid><author>juggte</author><pubDate>Wed, 22 Jun 2022 10:09:20 +0800</pubDate><description><![CDATA[初始化结构体
默认初始化
使用键值对初始化
列表初始化
部分初始化


结构体的指针
new 关键字创建结构体指针
访问结构体成员指针和对象都可以通过逗号访问结构体对象的成员，如果指针通过逗号访问成员编译器会默认解引用，(*pa),name 等价于 pa.name

结构体的访问权限
结构体名称首字母大写，那么在其他包内才可以定义Person对象，小写则无法访问。并且，结构体的属性首字母大写则其访问权限为public的，若为小写，则为private
编译器报错
方法首字母大写才能在其他包内访问

对象的方法]]></description><category></category></item><item><title><![CDATA[Golang 快速上手 (2)]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/125378697</link><guid>https://blog.youkuaiyun.com/juggte/article/details/125378697</guid><author>juggte</author><pubDate>Mon, 20 Jun 2022 22:28:33 +0800</pubDate><description><![CDATA[数组是相同数据类型的集合，数组一旦定义长度不能修改，数组可以通过索引访问
其内部元素。定义一个数组


slice （切片）

声明一个切片和声明一个数组差不多，不给出长度就为slice
切片为引用类型，可以使用make创建

初始化切片
直接初始化
使用数组对其初始化
还可以使用数组的一部分其初始化

切片的crud

add
切片是一个动态数组，可以使用append()函数对其添加元素

delele
go语言中并没有删除切片元素的专用方法，可以使用切片本身的特性来删除元素。删除下标2位置的元素
删除i]]></description><category></category></item><item><title><![CDATA[Golang 快速上手 (1)]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/125376215</link><guid>https://blog.youkuaiyun.com/juggte/article/details/125376215</guid><author>juggte</author><pubDate>Mon, 20 Jun 2022 18:40:58 +0800</pubDate><description><![CDATA[Golang 拥有非常严格的代码缩进规则

声明一个变量，但不使用也会报错

初始化变量
Go语言声明变量就会自动对变量对应的内存区域进行初始化。每个变量会被初始化成其类型的默认
值。如：整型和浮点型变量的默认值为0。字符串变量的默认值为空字符串“"。布尔型变量默认为false。  切片、函数、指针变量的默认为nil.初始化
变量类型可以省略，让其自动推导
短声明，省略var关键字，使用 :=
需要注意，短声明初始化方式只能使用在函数内部。

Golang 常量
常量在程序编译阶段就确定值，运行时则无法改变]]></description><category></category></item><item><title><![CDATA[音视频基础知识]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/125229632</link><guid>https://blog.youkuaiyun.com/juggte/article/details/125229632</guid><author>juggte</author><pubDate>Sun, 12 Jun 2022 16:14:38 +0800</pubDate><description><![CDATA[连续的图像快速变化上时，根据视觉暂留原理，人眼无法辨别单幅的静态画面；看上去是平滑连续的视觉效果，这样连续的画面叫作视频。视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程。每个色度成分通常用8bit表示[0,255]  ，每个通道的位深越大，能够表示的颜色值就越大，比如现在高端显示器说的10bit色彩，即是每个通道用10bit表示，每个通道有1024种颜色。102410241024约为10,7374万色=10亿色， 是8bit的64倍。常见的颜色还是8bit居多。RGB16 主要数据格式]]></description><category></category></item><item><title><![CDATA[moudo网络库剖析]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/124875330</link><guid>https://blog.youkuaiyun.com/juggte/article/details/124875330</guid><author>juggte</author><pubDate>Fri, 20 May 2022 23:04:53 +0800</pubDate><description><![CDATA[muduo简介

muduo是陈硕大神在Linux平台下基于C/C++开发的高性能网络库，在此基础上可以很方便的进行扩展，二次开发编写如http服务器。muduo网络库的核心框架，one thread per thread + Reactor模式。这也是大多数Linux端高性能网络编程框架应用的主要架构。
陈硕大神写的《Linux多线程服务器端编程》对muduo库整个框架和设计细节进行了非常详尽的介绍和分析，非常推荐大家阅读，不仅仅对网络编程有帮助。
此文使用muduo编写了一个简单的echoserver服]]></description><category></category></item><item><title><![CDATA[系统调用 eventfd]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/124744044</link><guid>https://blog.youkuaiyun.com/juggte/article/details/124744044</guid><author>juggte</author><pubDate>Fri, 13 May 2022 02:23:32 +0800</pubDate><description><![CDATA[eventfd 是 Linux 的一个系统调用，创建一个文件描述符用于事件通知，自 Linux 2.6.22 以后开始支持。
# bionic/libc/include/sys/eventfd.h（Android 8.0源码）
int eventfd(unsigned int initial_value, int flags);

eventfd() 函数会创建一个 eventfd 对象，用户空间的应用程序可以用这个 eventfd 来实现事件的等待或通知机制，也可以用于内核通知新的事件到用户空间应用程序。]]></description><category></category></item><item><title><![CDATA[Linux下常见错误码]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/124548417</link><guid>https://blog.youkuaiyun.com/juggte/article/details/124548417</guid><author>juggte</author><pubDate>Mon, 02 May 2022 22:48:41 +0800</pubDate><description><![CDATA[1 EPERM
Operation not permitted
操作不许可
2 ENOENT
No such file or directory
无此文件或目录
3 ESRCH
No such process
无此过程
4 EINTR
Interrupted system call
系统调用被禁止
5 EIO
I/O error
I/O 错误
6 ENXIO
No such device or address
无此器件或地址
7 E2BIG
Arg list too long
Arg 列表太长
8 ENOE]]></description><category></category></item><item><title><![CDATA[linux 进程间传递文件描述符]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/124486258</link><guid>https://blog.youkuaiyun.com/juggte/article/details/124486258</guid><author>juggte</author><pubDate>Fri, 29 Apr 2022 00:02:19 +0800</pubDate><description><![CDATA[在网络编程中可能使用到多进程模型，主进程只负责监听是否有连接到来，真正进行负责accept的是子进程，这就涉及到了进程间的文件描述符传递。
文件描述符在linux下只是一个整形数值，它的本质其实是 进程pcb中的文件描述符表 fd_array 的下标，fd_array是一个file* 类型的数组，实现文件描述符传递不能简单的将fd发送。



演示了主进程通过fork创建子进程，并创建unix domain socket进行通信，子进程向父进程发送打开的文件fd。

代码示例
#include &lt;sy]]></description><category></category></item><item><title><![CDATA[SizeBalancedTree C++实现]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/123910759</link><guid>https://blog.youkuaiyun.com/juggte/article/details/123910759</guid><author>juggte</author><pubDate>Fri, 01 Apr 2022 23:44:10 +0800</pubDate><description><![CDATA[SBT
SizeBalancedTree，SBT也是一种自平衡二叉搜索树，它的均摊时间复杂度不差于红黑树，实现起来比红黑树简单很多，它的旋转方式与AVL树一样，它的平衡条件靠的是每个节点的侄子节点不大于叔叔节点， 旋转的方式与AVL相同。
 
n1上的节点数量 和 n2上的节点数量 都不大于u2上的节点数量
n3上的节点数量 和 n4上的节点数量 都不大于u1上的节点数量
每个节点都符合以上条件就认为这棵树平衡。


SBT的特点


SBT在删除的时候，可以不用进行旋转调整树的高度，即使退化成链状也无所谓]]></description><category></category></item><item><title><![CDATA[C++11 新特性]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/123606645</link><guid>https://blog.youkuaiyun.com/juggte/article/details/123606645</guid><author>juggte</author><pubDate>Sun, 20 Mar 2022 02:27:20 +0800</pubDate><description><![CDATA[C++11

目录C++11列表初始化范围forSTL中的新容器arrayforward_listunordered_map/set右值引用  移动语义什么是左值、右值左值引用左值引用的短板右值引用


列表初始化


C++11里扩展了大括号 {} 的初始化，基本所有类型都可以使用它来初始化。

class Person {
public:
	Person(const string&amp; name, int age) :_name(name), _age(age) {}
private:
	strin]]></description><category></category></item><item><title><![CDATA[Linux多路转接 select、poll、epoll详解]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/123267895</link><guid>https://blog.youkuaiyun.com/juggte/article/details/123267895</guid><author>juggte</author><pubDate>Fri, 04 Mar 2022 17:11:37 +0800</pubDate><description><![CDATA[Linux网络编程 多路转接
五种IO模型，阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。
目录Linux网络编程 多路转接前言五种IO模型阻塞IO非阻塞IO信号驱动IO多路转接IO异步IOfcntl 设置非阻塞SetNonBlockselect函数原型


前言

IO简单来说就是read 和 write，总体分为两步 1 等待数据就绪 2 从内核中的缓冲区拷贝数据到用户区，或从用户区拷贝数据到内核区。高效IO的本质其实就是减少等待数据就绪的时间。IO多路IO转接服务器也叫做多任务IO服务]]></description><category></category></item><item><title><![CDATA[UDP/TCP 协议详解]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/123081423</link><guid>https://blog.youkuaiyun.com/juggte/article/details/123081423</guid><author>juggte</author><pubDate>Wed, 23 Feb 2022 21:04:12 +0800</pubDate><description><![CDATA[UDP / TCP
目录UDP / TCPUDP 协议UDP的特点UDP协议格式UDP的缓冲区TCP 协议TCP 协议报头确认应答（ACK）机制超时重传机制

UDP 协议

UDP的特点


无连接
一旦得知接收端的IP和端口号就可以加个报头直接向下层交付进行传输，不需要建立连接。


不可靠
没有确认、重传机制。无法得知也不关心报文是否到达接收端。


面向数据报
不能够灵活的控制读写数据的次数和数量。



应用层交给UDP多长的报文，UDP原样发送,既不会拆分，也不会合并。
用UDP传输100个字节]]></description><category></category></item><item><title><![CDATA[HTTP 协议]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/123058602</link><guid>https://blog.youkuaiyun.com/juggte/article/details/123058602</guid><author>juggte</author><pubDate>Mon, 21 Feb 2022 23:47:40 +0800</pubDate><description><![CDATA[HTTP的特征：

无连接：HTTP是基于TCP协议的，TCP已保证了连接。
无状态：HTTP协议本身是无状态的，不记录任何用户信息，但在某些场景需要识别客户端的状态，可以由Cookie Session技术保证。


URL
URL（Uniform Resource Locator） 统一资源定位符。



HTTP的请求方法


HTTP 状态码

4XX：一般是服务端request不合理的请求，或权限不足也可响应403。


HTTP常见Header

Content-Type：数据类型(text/ht]]></description><category></category></item><item><title><![CDATA[Linux系统编程 ---- 多线程详解]]></title><link>https://blog.youkuaiyun.com/juggte/article/details/122645535</link><guid>https://blog.youkuaiyun.com/juggte/article/details/122645535</guid><author>juggte</author><pubDate>Tue, 25 Jan 2022 08:00:00 +0800</pubDate><description><![CDATA[多线程
 线程(LWP: light weight process)，在Linux环境下线程的本质仍是进程，底层并没有一个专门的结构体来描述一个线程。也叫轻量级的进程。每个进程至少有一个执行流，也就是一个线程。
目录多线程概述线程的历史线程的用途线程的优缺点


概述
进程，硬盘上的程序运行以后，会在内存空间里形成一个PCB（进程控制块）。每个进程拥有自己的虚拟地址空间（mm_struct）。进程是承当操作系统资源分配的实体，线程是CPU的最小执行单元。
线程存在于进程当中(进程可以认为是线程的容器)，进程]]></description><category></category></item></channel></rss>