- 博客(47)
- 资源 (11)
- 收藏
- 关注
原创 Linux下对mmap封装使用
mmap即memory map,是一种内存映射文件的技术。mmap可以将一个文件或者其它对象映射到进程的地址空间,进而实现磁盘地址和进程虚拟地址的一一对应关系。通过使用mmap技术,我们可以让不同进程通过映射到同一个普通文件的方式实现共享内存,普通文件被映射到进程地址空间当中之后,进程可以向访问普通内存一样对文件高效地进行一系列操作。mmap()必须以PAGE_SIZE(默认为4KB) 为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以。
2023-05-18 10:44:41 2493 8
原创 一个基于Python的tkinter模块实现的游戏活动日历模拟器
该项目使用Python的tkinter模块编写显示界面,通过解析excel表格中的活动数据,将各个活动的触发时间、运行时间、活动名、活动类型等以直观的方式展现出来。
2023-05-15 09:52:03 2578 3
原创 Linux系统调用SYSCALL_DEFINE详解
Linux系统调用SYSCALL_DEFINE详解Linux源码可以去这里 https://mirrors.edge.kernel.org/pub/linux/kernel/ 下载,本文是基于linux-2.6.34版本来讲解的,老版本代码比较简洁,更容易看懂。学过Linux系统编程的小伙伴应该都知道,Linux的系统调用在内核中的入口函数都是 sys_xxx ,但是如果我们拿着内核源码去搜索的话,就会发现根本找不到 sys_xxx 的函数定义,这是因为Linux的系统调用对应的函数全部都是由 SY
2021-07-22 08:37:35 4608 41
原创 硬核!全网最全Nginx配置指令,建议收藏~
scgi_bind语法:scgi_bind address [transparent]; scgi_bind off;参数说明:address – 表示IP地址,可以包含变量transparent – 表示允许从非本地IP地址发起与SCGI服务器的连接off – 表示取消了scgi_bind指令从上一个配置级别继承的影响,它允许系统自动分配本地IP地址和端口默认:none上下文:http块、http块中的server块、http块中的location块说明:从指定的带有
2021-07-19 10:47:09 6457 156
原创 HTTP状态码大全
HTTP状态码大全状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。101服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。 只有在切换新的协议更有好处的时候
2021-07-13 10:14:38 4317 76
原创 C++ RTTI详解
C++ RTTI详解1、RTTI简介2、typeid详解2.1、type_info2.2、typeid识别静态类型2.3、typeid识别动态类型2.4、typeid实现原理3、dynamic_cast详解4、总结1、RTTI简介RTTI(Runtime Type Identification)是“运行时类型识别”的意思。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。但是现在RTTI的类型识别已经不限于此了,它还能通过typeid操作符识别出所有的基
2021-07-09 08:43:07 19313 182
原创 C++在终端、文件中就地覆盖输出的方法
C++在终端、文件中就地覆盖输出的方法1、在终端就地覆盖输出字符2、在文件中就地覆盖输出字符3、总结1、在终端就地覆盖输出字符先上效果图,如图1-1所示:图1-1对应的程序如下:#include <iostream>#include <unistd.h>int main(int argc, char* argv[]){ // 设置为无缓冲 setbuf(stdout, NULL); // 隐藏光标 std::cout <<
2021-07-06 21:42:34 4900 70
原创 深入理解C++中五种强制类型转换的使用场景
C++中五种强制类型转换解析1、C风格的强制类型转换2、C++风格的强制类型转换2.1、static_cast2.1.1、类实例转换场景使用static_cast2.1.2、没有多态的场景下使用static_cast2.1.3、具有多态的场景下使用static_cast2.2、const_cast2.3、reinterpret_cast2.4、dynamic_cast3、总结1、C风格的强制类型转换C风格的强制类型转换容易理解,不管什么类型的转换都可以直接进行转换,使用格式如下:Type b = (T
2021-07-03 12:59:25 11306 205
原创 一文读懂C++虚继承的内存模型
一文读懂C++虚继承的内存模型1、前言2、多继承存在的问题3、虚继承简介4、虚继承在标准库中的使用5、虚继承下派生类的内存布局解析6、总结1、前言C++虚继承的内存模型是一个经典的问题,其具体实现依赖于编译器,可能会出现较大差异,但原理和最终的目的是大体相同的。本文将对g++中虚继承的内存模型进行详细解析。2、多继承存在的问题C++的多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。从概念上来讲这是非常简单的,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突
2021-06-30 21:27:24 10820 224
原创 C++11的std::is_same和std::decay使用与源码解析
C++11的std::is_same和std::decay源码解析1、源码准备2、使用方法2.1、std::is_same使用方法2.2、std::decay使用方法2.3、std::is_same和std::decay配合使用3、源码解析3.1、std::is_same源码解析3.2、std::decay源码解析4、总结1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::is_same和std::decay是C++11才加入标准的,所以低版本的gcc源码是没有这个的,建议选择4.9.
2021-06-28 20:00:04 3847 120
原创 一文读懂C++虚函数的内存模型
一文彻底读懂C++虚函数表的实现机制(使用GDB内存布局)1、虚函数简介2、虚函数表简介3、有继承关系的虚函数表剖析3.1、单继承无虚函数覆盖的情况3.2、单继承有虚函数覆盖的情况3.3、多重继承的情况3.4、多层继承的情况4、总结1、虚函数简介C++中有两种方式实现多态,即重载和覆盖。重载:是指允许存在多个同名函数,而这些函数的参数表不同(参数个数不同、参数类型不同或者两者都不同)。覆盖:是指子类重新定义父类的虚函数的做法,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际
2021-06-26 08:49:00 11810 228
原创 杂谈C++11一个有趣的设计——std::_Build_index_tuple
杂谈C++11一个有趣的设计——std::_Build_index_tuple1、源码准备2、使用方法3、源码解析3.1、_Index_tuple解析3.2、_Build_index_tuple解析4、总结1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::_Build_index_tuple是C++11才加入标准的,所以低版本的gcc源码是没有这个的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址http:/
2021-06-23 19:02:50 3557 189
原创 C++的智能指针auto_ptr、unique_ptr源码解析
C++的智能指针auto_ptr、unqiue_ptr源码解析1、前言2、源码准备3、源码解析3.1、auto_ptr解析3.2、unqiue_ptr解3.3、unqiue_ptr的一个偏特化版本4、智能指针相关内容的总结5、总结1、前言本文仅对C++智能指针auto_ptr、unqiue_ptr源码进行解析,需要读者有一定的C++基础并且对智能指针有所了解,本文并不对智能指针的使用方法、使用场景、效率等方面进行阐述分析,这些知识需自行查阅相关书籍去了解。建议大家先看一下这篇文章《C++11的智能指
2021-06-22 12:09:37 3130 213
原创 一文读懂C++11的Lambda表达式的用法与原理
一文读懂C++11的Lambda表达式的用法与原理1、Lambda表达式简介2、Lambda表达式使用方法介绍3、Lambda表达式实现原理解析4、总结1、Lambda表达式简介Lambda表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。2、Lambda表达式使用方法介绍C
2021-06-20 13:30:06 5525 184
原创 C++11的std::function源码解析
C++11的std::function源码解析1、源码准备2、std::function简介3、源码解析3.1、std::function解析3.2、std::_Function_handler1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::function是C++11才加入标准的,所以低版本的gcc源码是没有std::function的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址http://ftp.
2021-06-17 14:48:36 6354 172
原创 C++11的std::addressof源码解析
C++11的std::addressof源码解析1、源码准备2、std::addressof的简介3、std::addressof源码解析1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::addressof是C++11才加入标准的,所以低版本的gcc源码是没有这个的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址http://ftp.gnu.org/gnu/gcc2、std::addressof的简介
2021-06-16 21:56:05 2984 107
原创 使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子
使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子1、相关术语1.1、P2P网络1.2、DHT网络1.3、Kademlia算法1.4、KRPC协议1.5、MagNet协议1.6、本段小结2、BT下载的一些概念梳理2.1、BT软件下载原理2.2、迅雷获取种子的速度为什么那么快2.3、资源时效性问题2.4、好用的BT软件2.5、有没有已经编写好的DHT爬虫3、使用C++编写DHT爬虫3.1、实现原理3.2、实现DHT协议3.2.1、创建UDP服务3.2.2、加入DHT网络3.2.3、报文解析3.2.4、
2021-06-15 12:51:13 19011 285
原创 DHT协议介绍
DHT协议介绍1、前言2、DHT协议介绍2.1、概述2.2、路由表2.3、BitTorret协议扩展2.4、Torrent文件扩展2.5、KRPC协议2.6、联系信息编码2.7、DHT请求2.7.1、ping2.7.2、find_node2.7.3、get_peers2.7.4、announce_peer1、前言英文版官方地址:http://www.bittorrent.org/beps/bep_0005.htmllDHT协议BitTorrent使用一种叫做分布式哈希表(distributedslo
2021-06-12 21:48:18 4292 194
原创 B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器
B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器1、什么是B编码2、B编码格式3、种子文件结构3.1、主文件结构3.2、info结构4、简单的例子了解一下种子文件和B编码5、分析JSON-CPP的设计5.1、分析Json::Value::CZString的设计5.2、分析Json::Value的设计5.2.1、类成员设计5.2.2、类方法设计5.3、迭代器的设计5.3.1、Json::ValueIteratorBase5.3.2、Json::ValueConstIterator5.3.3
2021-06-12 21:40:38 3121 78
原创 Nginx实战之autoindex模块源码解析
Nginx实战之autoindex模块源码解析1、前言2、查看网页显示的html文件的内容3、ngx_http_autoindex_module.c文件解析3.1、ngx_http_autoindex_module结构体解析3.2、ngx_http_autoindex_module_ctx结构体解析3.2.1、ngx_http_autoindex_init函数解析3.2.2、ngx_http_autoindex_create_loc_conf函数解析3.2.3、ngx_http_autoindex_merg
2021-06-12 15:34:44 2271 41
原创 Redis源码编译篇之Makefile文件详解
Redis源码编译篇之Makefile文件详解1、前言2、Makefile文件详解3、src/Makefile文件详解3.1、Makefile.dep目标3.2、通用的生成目标文件的target3.3、all目标所依赖的各个子目标的名称设置3.4、all目标所依赖的各个子目标的内容3.4.1、REDIS_SERVER_NAME目标3.4.2、REDIS_SENTINEL_NAME目标3.4.3、REDIS_CHECK_RDB_NAME目标3.4.4、REDIS_CHECK_AOF_NAME目标3.4.5、R
2021-06-09 21:20:56 3089 236
原创 Nginx编译配置脚本最终篇 - configure脚本
Nginx编译配置脚本最终篇 - configure脚本1、相关文章2、前言3、configure脚本详解3.1、设置LC_ALL宏3.2、调用auto/options脚本3.3、调用auto/init脚本3.4、调用auto/sources脚本3.5、objs/目录相关内容3.6、写入NGX_DEBUG宏到objs/ngx_auto_headers.h文件3.7、设置与系统相关的几个变量3.8、调用auto/cc/conf脚本3.9、调用auto/headers脚本3.10、调用auto/os/conf脚
2021-06-07 20:17:10 4873 194
原创 Nginx编译配置脚本篇(10)- Makefile相关脚本
Nginx编译配置脚本篇(10)- Makefile相关脚本1、相关文章2、前言3、auto/make脚本文件详解3.1、输出调试信息表示创建objs/Makefile文件3.2、创建存放目标文件的目录3.3、设置ngx_objs_dir和ngx_use_pch3.4、输出编译参数相关信息到objs/Makefile文件中3.5、根据NGX_PERL_CFLAGS输出信息到objs/Makefile文件中3.6、输出ALL_INCS变量到objs/Makefile文件中3.7、输出CORE_DEPS和COR
2021-06-02 21:29:08 4246 248
原创 Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf
Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf1、相关文章2、前言3、auto/lib/conf脚本文件详解4、auto/lib/openssl/conf脚本文件详解4.1、OPENSSL的值不为NONE的情况4.2、OPENSSL的值为NONE的情况5、总结1、相关文章由于学习本文需要Nginx源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块Ngin
2021-06-01 21:30:11 4903 41
原创 Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules
Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules1、相关文章2、前言3、auto/module脚本文件详解3.1、设置ngx_var的值3.2、当ngx_module_link的值为DYNAMIC的情况3.3、当ngx_module_link的值为YES的情况3.4、当ngx_module_link的值为YES的情况3.5、小结4、auto/modules脚本文件详解4.1、初始化一堆变量4.2、分析一个调用auto/module的典型例子4.3、将之前的内容输出到文件中4.3.1、输
2021-05-30 22:39:03 4972 26
原创 Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix
Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix1、相关文章2、前言3、auto/unix脚本文件详解3.1、根据当前NGX_USER的设置NGX_GROUP3.2、检查当前环境是否支持poll3.3、检查当前环境是否支持devpoll3.4、检查当前环境是否支持kqueue3.5、NetBSD环境下设置NGX_KQUEUE_UDATA_T宏3.6、写入NGX_HAVE_UNIX_DOMAIN宏到头文件3.7、调用auto/types/目录下的脚本文件3.8、使用auto/feature
2021-05-27 21:31:44 4078 27
原创 Nginx编译配置脚本篇(6)- 系统环境相关脚本
Nginx编译配置脚本篇(6)- 系统环境相关脚本1、相关文章2、前言3、auto/os/conf脚本文件详解3.1、输出当前操作系统名称(NGX_SYSTEM)3.2、根据NGX_PLATFORM执行对应的脚本文件3.3、根据处理器的类型设置缓存行大小4、auto/os/linux脚本文件详解4.1、写入当前系统类型到头文件4.2、设置与Makefile相关变量4.3、设置分行符(ngx_spacer)4.4、设置Linux内核版本相关信息4.5、设置epoll相关信息4.6、设置openat函数相关信息
2021-05-27 21:28:10 3755 16
原创 Nginx编译配置脚本篇(5)- 编译器相关脚本
Nginx编译配置脚本篇(5)- 编译器相关脚本1、相关文章2、前言3、auto/cc/name脚本文件详解4、auto/cc/conf脚本文件详解4.1、设置LINK变量4.2、设置编译选项变量4.3、设置文件后缀变量4.4、设置某些平台相关变量4.5、设置某些符号变量4.6、调用auto/cc/name脚本4.7、根据NGX_CC_NAME选择对应的编译器的配置脚本4.8、检查环境是否支持链接选项4.9、检查环境是否支持-Wl -E选项4.10、检查环境是否支持gcc的原子操作4.11、检查环境是否支持
2021-05-25 22:23:19 6512 22
原创 Nginx编译配置脚本篇(4)- 工具型脚本系列
Nginx编译配置脚本篇(4)- 工具型脚本系列1、相关文章2、前言3、目录3.1、auto/have脚本文件3.2、auto/nohave脚本文件3.3、auto/define脚本文件3.4、auto/have_headers脚本文件3.5、auto/feature脚本文件3.5.1、输出检查提示信息3.5.2、初始化ngx_found变量3.5.3、初始化ngx_have_feature变量3.5.4、初始化ngx_feature_inc_path变量3.5.5、生成自动测试程序3.5.6、编译自动测试
2021-05-25 22:17:56 8633 16
原创 Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources
Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources1、相关文章2、前言3、auto/sources文件内容详解3.1、核心模块3.1.1、核心模块名称(CORE_MODULES)3.1.2、核心模块头文件所在目录(CORE_INCS)3.1.3、核心模块头文件(CORE_DEPS)3.1.4、核心模块源文件(CORE_SRCS)3.2、事件模块3.2.1、事件模块名称(EVENT_MODULES)3.2.2、事件模块头文件所在目录(EVENT_INCS)3.2.3、事件模块头文件(E
2021-05-24 22:25:12 5970 19
原创 Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init
Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init1、相关文章2、前言3、auto/init文件内容详解2.1、Makefile文件路径设置2.2、模块文件路径设置2.3、头文件路径设置2.4、自动测试文件路径和配置错误文件路径设置2.5、STUBS相关文件路径设置2.6、PCH相关文件路径设置2.7、测试所在环境的"\c"和"-n"2.8、创建Makefile文件并写入部分内容3、总结1、相关文章由于学习本文需要Nginx源码及搭建相关的编译环境,且本文与前面的文章有先后呼
2021-05-24 22:02:28 6572 16
原创 Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options
Nginx编译配置脚本篇(1)- 解析配置选项脚本auto/options1、相关文章2、前言3、auto/options文件详解3.1、初始化变量3.2、读取传入配置参数3.3、设置NGX_CONFIGURE变量的值3.4、显示帮助信息3.5、设置NGX_WINE变量的值3.6、设置各类文件路径4、总结1、相关文章由于学习本文需要Nginx源码及搭建相关的编译环境,所以建议大家按以下文章顺序阅读CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块2、前言本文将分析N
2021-05-24 21:55:32 7643 19
原创 CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块
CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块1、CentOS 7环境搭建2、Nginx源码下载3、编译安装4、配置autoindex模块4.1、autoindex模块配置参数说明4.2、修改配置文件4.3、验证是否启动autoindex成功5、总结1、CentOS 7环境搭建CentOS 7环境搭建可以看一下这篇文章 bifang框架运行环境搭建入门指南,这里就不赘述了2、Nginx源码下载Nginx源码可以去这里 Nginx官方下载界面 下载,我这里用的是ngin
2021-05-23 22:46:25 8986 44
原创 C++封装一个易用的打印backtrace信息的函数
C++封装一个易用的打印backtrace信息的函数1、前言2、几个需要用到函数2.1、backtrace函数2.2、backtrace_symbols函数2.3、__cxa_demangle函数3、测试各个函数的使用3.1、使用backtrace()获取到的堆栈信息3.2、使用backtrace_symbols()转换后的堆栈信息3.3、使用__cxa_demangle()获取原始的函数名4、完整源代码展示1、前言当我们平时在调试程序时,在遇见某些错误时,往往需要打印出当前错误点的函数调用堆栈信息(
2021-05-21 22:17:43 7080 34
原创 C++基于RAII对锁进行封装
1、RAII简介RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。2、RAII分类根据RAII对资源的所有权可分为常性类型和变性类型,代表者分别是std::shared_p
2021-05-21 16:30:19 4516 11
原创 C++11的右值引用、移动语义(std::move)和完美转发(std::forward)详解
C++11的右值引用、移动语义(std::move)和完美转发(std::forward)详解1、源码准备2、C++11右值引用概念2.1、左值和右值2.2、右值引用3、C++11的移动语义(std::move)和完美转发(std::forward)3.1、移动语义(std::move)3.2、完美转发(std::forward)4、总结1、源码准备本文是基于gcc-4.9.0的源代码进行分析,右值引用相关内容是C++11才加入标准的,所以低版本的gcc源码是没有这些相关的内容的,建议选择4.9.0或
2021-05-20 22:24:37 6358 29
原创 C++11的std::mem_fn源码解析
C++11的std::mem_fn源码解析1、源码准备2、通过一个简单的例子来了解std::mem_fn的作用3、std::mem_fn源码解析3.1、std::mem_fn解析3.2、std::_Mem_fn解析3.3、在代码中正确使用std::_Mem_fn4、总结1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::mem_fn是C++11才加入标准的,所以低版本的gcc源码是没有std::mem_fn的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是
2021-05-19 23:34:30 10082 15
原创 Linux C程序修改进程名称
Linux C程序修改进程名称(通过修改argv[0])1、前言2、命令行参数(argc, argv)以及环境变量(environ)介绍2.1、C程序典型的存储空间布局2.2、argc, argv介绍2.3、environ介绍2.4、编写程序验证修改进程名是否可以成功2.5、查看进程名变长之后影响了那部分内存的数据1、前言Linux C程序运行时,进程的名称通常就是argv[0],而通过修改内存中argv[0]存储的内容就可以修改进程名了。下面对此作详细介绍。2、命令行参数(argc, argv)
2021-05-13 22:49:14 8115 26
原创 C++11的std::ref、std::cref源码解析
C++11的std::ref、std::cref源码解析1、源码准备2、std::ref和std::cref的作用3、std::ref相关源码解析3.1、std::ref解析3.1、std::reference_wrapper解析3.3、std::remove_cv解析3.4、std::_Reference_wrapper_base解析4、总结1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::ref和std::cref是C++11才加入标准的,所以低版本的gcc源码是没有这两个的,建
2021-05-09 13:28:57 13668 20
原创 C++11的智能指针shared_ptr、weak_ptr源码解析
C++智能指针shared_ptr源码解析1、前言2、源码准备3、智能指针概念4、源码解析4.1、shared_ptr解析4.1.1、shared_ptr4.1.2、__shared_ptr4.1.3、__shared_count4.1.4、_Sp_counted_base4.1.5、_Sp_counted_ptr1、前言本文仅对C++智能指针shared_ptr、weak_ptr源码进行解析,需要读者有一定的C++基础并且对智能指针有所了解,但是本文不对智能指针的使用方法、使用场景、效率等方面进行阐述
2021-05-08 22:28:02 15748 21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人