- 博客(98)
- 收藏
- 关注
转载 Git小品一则(图一乐)
你应该先 fork 我的仓库,然后从 develop 分支 checkout 一个新的 feature 分支,比如叫 feature/confession。在 PR 描述里,你要详细说明你的功能改动和实现思路,并且 @ 我和至少两个其他的评审。我们会 review 你的代码,可能会留下一些评论,你需要解决所有的 thread。等 CI/CD 流水线全部通过,并且拿到至少两个 LGTM 之后,我才会考虑把你的分支 squash and merge 到 develop 里,等待下一个版本发布。
2025-11-20 14:06:16
30
原创 Linux 网络层与IP协议
本文主要介绍了网络层相关概念和技术。首先阐述了IP协议的核心作用及构成,指出IP协议提供跨网络传输能力,TCP协议则处理传输策略问题。随后详细解析了IP协议报头结构及各字段功能,包括服务类型、生存时间、检验和等关键信息。文章重点讨论了子网划分的必要性和技术实现,包括分类划分法、CIDR无类别域间路由和子网掩码的应用,解释了这些技术如何提高IP地址利用率并解决地址短缺问题。此外还介绍了公网与内网的区别、IP地址的特殊类型,以及路由表的工作原理和报文分片重组机制。最后简要说明了运营商在网络架构中的角色以及NAT
2025-11-18 17:19:56
967
1
原创 Linux 传输层协议
摘要: 传输层负责端到端数据传输,通过端口号标识应用程序。UDP协议采用8字节定长报头,具有16位端口号和总长度字段,特点是无连接、不可靠、面向数据报。TCP协议通过确认应答、超时重传等机制保证可靠性,使用32位序号和确认序号处理数据排序和应答。TCP通过三次握手建立连接,四次挥手断开连接,并利用流量控制机制调整数据传输速率。操作系统使用sk_buff结构体统一管理网络报文,通过移动data指针实现报文的封装和解包。TCP标志位(如SYN、ACK等)区分报文类型,实现连接管理和异常处理。
2025-11-12 19:50:41
959
4
原创 Linux 重定向与Cookie
本文摘要: HTTP重定向与状态管理技术解析: 重定向机制 3xx状态码实现URL跳转(301永久/302临时) 示例演示了通过Location报头实现域名跳转和404页面重定向 请求方法与应用 GET/POST方法差异及表单数据处理 实现微服务接口注册机制处理登录等交互请求 POST相比GET更安全但需HTTPS加密保护 连接优化 短连接与长连接(keep-alive)对比 通过TCP保持连接复用提升多资源请求效率 状态管理 Cookie技术解决HTTP无状态问题 Session机制通过服务端存储增强安全
2025-11-10 21:02:08
904
2
原创 Linux Http协议初识
本文介绍了HTTP协议的基本原理与实现方法。首先解释了URL的结构组成和域名解析过程,说明了HTTP协议使用域名而非IP地址的原因。然后详细分析了HTTP请求报文和响应报文的格式,包括状态行、报头字段、空行和正文部分。通过C++代码示例展示了如何实现HTTP协议的序列化和反序列化过程,包括请求解析、资源定位、状态码设置和响应构建等核心功能。文章还讨论了工具类的实现方法,如文件读取、行分割和大小获取等操作。最后通过测试验证了HTTP服务器的基本功能,能够正确处理GET请求并返回对应的资源文件。
2025-11-09 01:08:24
1039
1
原创 Linux 进程间关系与守护进程
本文介绍了Linux系统中的进程间关系,包括进程组、会话和作业控制,并详细讲解了如何创建守护进程。主要内容包括:1)进程组的概念和生命周期;2)会话的定义和控制终端的关系;3)作业控制的前后台区分;4)守护进程的创建步骤,包括创建子进程、建立新会话、改变工作目录等关键操作;5)给出了完整的守护进程实现代码示例,展示了如何将网络服务器守护进程化。守护进程是独立于控制终端的后台进程,能够确保服务不受用户登录/注销的影响持续运行。
2025-11-06 20:29:52
603
1
原创 Linux 自定义协议实现网络计算器
本文介绍了网络编程中应用层协议的实现过程,重点讲解了序列化与反序列化在TCP通信中的应用。文章首先分析了TCP粘包问题产生的原因,提出了通过自定义协议解决数据完整性问题的方法。然后详细阐述了使用JSON库实现结构化数据的序列化与反序列化,包括添加长度报头确保报文完整性的Encode/Decode方法。最后以网络计算器为例,展示了完整的协议设计流程,包括Request/Response类的实现、协议解析和业务逻辑处理。文章强调在应用层使用序列化方案的重要性,并提供了TCP服务器的封装实现,通过分层设计将网络通
2025-11-04 20:35:56
910
3
原创 Linux TcpSocket编程
本文介绍了TCP套接字的基础原理和实现方法,包括TCP三次握手的过程以及多版本echo系统的实现。首先详细讲解TCP套接字的创建、绑定、监听、连接和数据收发等核心操作,并通过饭店服务员的类比解释监听套接字与通信套接字的区别。其次阐述了多进程、多线程和线程池三种并发模型的实现方式及其优缺点。最后展示了如何基于TCP套接字构建翻译系统和远程命令执行系统,其中命令系统采用白名单机制确保安全性,通过popen接口执行命令并返回结果。文章提供了完整的代码示例,展示了从基础网络通信到实际应用系统的实现过程。
2025-11-02 17:17:47
1025
原创 Linux UdpSocket的应用
本文介绍了一个基于UDP Socket的翻译系统和消息群发系统。翻译系统通过Dict类实现英汉单词互译,包含字典加载和查询功能。消息群发系统采用多线程架构,实现了客户端消息的实时接收和服务器端的并发处理,通过路由机制实现消息广播。系统利用线程池提高吞吐量,采用互斥锁保证线程安全,并通过双线程设计确保客户端的实时交互。两个系统均基于UDP协议,展示了网络编程中I/O处理、并发控制和消息路由的关键技术实现。
2025-11-01 16:40:54
913
原创 Linux Socket网络编程基础
本文介绍了网络编程的基础知识和基于Socket实现的简单收发信息系统。主要内容包括: 网络通信基础 使用IP地址和端口号标识全网唯一进程 端口号划分:知名端口(0-1023)和动态端口(1024-65535) 套接字(Socket)概念:IP+端口组成通信端点 传输层协议差异 TCP:面向连接、可靠传输、字节流 UDP:无连接、不可靠、数据报但效率高 重要编程接口 socket():创建套接字 bind():绑定IP和端口 recvfrom()/sendto():UDP数据收发 实现示例 封装UdpServ
2025-10-30 19:30:44
788
1
原创 Linux 网络初识
本文系统介绍了Linux网络学习的知识脉络,从网络基础到协议分层,再到网络传输流程。主要内容包括:1.网络发展历史,从局域网到广域网的演进;2.协议的概念与分层设计,重点解析OSI七层模型和TCP/IP五层模型;3.网络传输的基本流程,包括局域网通信机制、MAC地址作用、数据封装与解包过程;4.跨网络传输原理,解析IP地址与MAC地址的配合使用,以及路由器在网络互联中的关键作用。文章强调网络协议的本质是约定好的数据结构,并通过分层设计实现解耦,为后续深入学习网络编程奠定基础。
2025-10-28 20:07:12
841
1
原创 Linux POSIX信号量与线程池
本文主要介绍了多线程编程中的关键技术和实现方法,包括条件变量封装、POSIX信号量应用、环形队列生产者消费者模型、线程池实现以及线程安全相关概念。首先详细讲解了条件变量和信号量的封装方法,随后通过环形队列实现高效的生产者消费者模型,并分析了多线程场景下的同步机制。接着阐述了线程池的设计,包括单例模式实现、任务队列管理和线程调度策略。最后讨论了线程安全与重入的区别,以及STL容器和智能指针的线程安全性。全文系统性地展示了多线程编程的核心技术,为提高程序并发性能提供了实用方案。
2025-10-24 16:57:14
637
2
原创 Linux 线程控制与同步互斥
本文摘要: 本文详细探讨了Linux系统中的线程控制与同步机制。第一部分介绍了线程创建方法,包括使用clone系统调用创建轻量级进程的技术实现,分析了线程栈的空间分配特性,并展示了C++线程封装类的实现。第二部分深入讲解了线程同步与互斥问题,通过抢票案例演示了数据竞争现象,阐述了互斥锁的原理与实现,包括硬件级原子操作和自旋锁机制。第三部分重点讨论了生产者消费者模型,基于阻塞队列实现了多线程任务调度,分析了条件变量的使用场景和工作原理。
2025-10-20 20:12:26
928
2
原创 Linux 线程控制
本文主要探讨Linux系统中线程的实现原理与控制方法。首先分析了线程与进程的关系,指出Linux通过轻量级进程模拟线程,使用pthread库封装系统调用。文章详细介绍了线程创建、等待、终止、分离等操作接口,并解释了线程ID、传参和返回值的实现机制。通过代码示例展示了多线程编程中的资源共享、异常处理等问题,揭示了线程控制块在用户空间的管理方式。最后阐述了用户级线程与内核轻量级进程的1:1对应关系,说明线程调度最终由内核完成,但线程属性由用户空间库维护的特殊实现机制。
2025-10-17 21:10:35
707
3
原创 Linux 线程与页表
本文系统介绍了Linux线程与内存管理的核心概念:1. Linux采用轻量级进程模拟线程,通过共享地址空间实现线程间资源共享;2. 内存管理采用4KB页框划分,通过页表实现虚拟地址到物理地址的映射;3. 多级页表配合TLB快表提升寻址效率,缺页中断机制实现按需内存分配;4. 线程资源划分本质是对地址空间的划分,虚拟地址机制既解决内存碎片问题又保证进程独立性。文章深入剖析了线程实现原理与内存管理机制的内在联系。
2025-10-15 18:10:37
859
3
原创 Linux 信号捕捉与软硬中断
本文深入探讨了操作系统中信号处理机制与中断系统的核心原理。主要内容包括:1.信号处理流程,重点分析进程从内核态返回用户态时的信号检查机制、自定义信号处理函数执行时的身份切换过程;2.硬件中断与软件中断的实现原理,详细讲解外设通过中断控制器与CPU交互的过程,以及系统调用等软中断触发方式;3.用户态与内核态的切换机制,解释CPU通过特权级和页表实现的权限控制;4.信号捕捉相关API(sigaction)的使用及其内部实现机制;5.可重入函数、volatile关键字等高级概念的应用场景分析。
2025-10-14 22:40:25
1077
2
原创 Linux 信号
本文介绍了Linux系统中的信号机制。信号是一种异步通知机制,用于进程间通信和事件处理。文章首先通过生活中的例子(如闹钟、红绿灯)类比信号的工作原理,解释了信号的基本概念和特性。然后详细阐述了信号的产生方式(键盘输入、系统调用、异常和软件触发),以及信号的处理过程(默认处理、自定义处理和忽略)。接着深入讲解了信号的保存机制,包括未决、递达和阻塞三种状态,并通过代码示例展示了如何操作信号集和屏蔽信号。最后讨论了信号终止进程的两种方式(Term和Core)及其区别,以及如何利用核心转储进行调试。
2025-10-13 19:35:51
1062
2
原创 Linux 进程通信——基于责任链模式的消息队列
本文介绍了消息队列的原理及其在操作系统中的实现细节,以及如何结合责任链模式构建高效的消息处理系统。消息队列作为一种进程间通信机制,允许进程发送带类型的数据块,但存在消息长度和队列总容量限制。文章详细分析了消息队列的通信方式、内核数据结构及相关接口。随后,引入责任链设计模式,通过构建格式化处理、文件保存和备份检查三个处理节点,形成链式消息处理流程。最后展示了基于责任链模式的消息队列实现方案,包括客户端发送消息和服务端接收处理消息的完整代码示例,实现了消息格式化、存储和自动备份等功能。
2025-10-11 20:03:14
1304
原创 Linux 进程通信——基于建造者模式的信号量
本文介绍了mmap文件映射和基于建造者模式的信号量实现。mmap系统调用可将文件或设备映射到进程地址空间,减少IO开销,支持读写共享。通过示例展示了mmap的创建、读写操作及作为malloc底层实现的匿名映射方式。信号量部分采用建造者模式设计,包含产品类、抽象建造者、具体建造者和指挥者类,实现了信号量的创建、初始化和PV操作。具体建造者类封装了信号量集创建、权限设置等细节,指挥者类负责构建过程控制。最后通过父子进程同步打印的示例,演示了信号量的实际应用。
2025-10-11 18:59:05
926
原创 Linux 进程通信——消息队列与信号量
本文介绍了SystemV IPC机制中的消息队列和信号量。消息队列通过内核维护的队列实现进程间通信,使用key标识唯一性,支持msgget、msgctl、msgsnd和msgrcv等接口操作。信号量作为计数器用于资源管理,通过semget创建、semctl删除、semop进行PV操作。文章还分析了内核如何通过ipc_ids结构统一管理三种IPC资源(消息队列、信号量和共享内存),使用包含ipc_perm的柔性数组进行组织,并通过类型转换访问具体资源。两种机制都遵循SystemV标准,具有相似的接口设计和生命
2025-10-10 22:04:36
693
1
原创 Linux 进程间通信——System V
本文介绍了SystemV进程间通信中的共享内存机制。共享内存通过将物理内存区域映射到多个进程的地址空间实现高效通信,其生命周期随内核而非进程。文章详细讲解了共享内存的关键系统调用接口:shmget(创建)、shmat(挂载)、shmdt(卸载)和shmctl(控制管理),并给出了C++封装示例。通过管道文件实现同步机制,解决共享内存无内置同步的缺点。最后指出共享内存大小需为4KB整数倍,并介绍了内核管理结构shmid_ds。共享内存是最高效的IPC方式,但需要配合同步机制保证数据一致性。
2025-10-08 18:16:55
917
1
原创 Linux 进程通信——命名管道
本章主要解决匿名管道在多子进程场景下的资源回收问题,并提出两种解决方案:1)从后向前关闭管道文件描述符;2)让子进程自行处理多余写端。随后引入命名管道(FIFO)的概念,说明其通过文件路径实现无关进程间通信的原理。通过代码示例展示了命名管道的创建、使用和删除过程,并实现了客户端-服务端的通信模型。命名管道与匿名管道特性相同,但能实现任意进程间的通信。
2025-10-07 19:11:44
890
原创 Linux 进程通信——匿名管道
本文介绍了Linux中的匿名管道进程通信机制。主要内容包括:1. 进程通信的目的(数据传输、资源共享、通知事件、进程控制);2. 匿名管道的原理和特性,它只能用于父子进程间的通信,具备半双工、同步机制等特点;3. 演示了使用pipe()系统调用创建管道,并通过代码示例展示了父子进程的读写操作;4. 分析了四种通信情况(不同读写速度组合)的处理方式;5. 基于匿名管道实现了一个进程池,父进程通过轮询方式向子进程分发任务。匿名管道是Linux中简单高效的进程通信方式,适合有血缘关系的进程间通信需求。
2025-10-05 22:22:06
698
原创 Linux 动静态库与加载原理
文章深入探讨了ELF文件格式,包括其结构(ELF头、程序头表、节头表等)以及动静态库的加载原理。静态库在链接时将代码直接拷贝到可执行程序,而动态库在运行时加载。解释了虚拟地址空间的概念,说明可执行程序加载到内存时会保持统一的虚拟地址编址。最后讨论了动态库通过GOT(全局偏移表)实现的地址无关代码特性,以及库之间的依赖关系处理机制。
2025-10-03 19:18:04
821
原创 Linux 文件系统
本文摘要:文章首先测试了自定义实现的glibc文件接口,验证了缓冲区刷新机制。随后深入探讨了文件系统原理,从磁盘物理结构(磁道、扇区等)到逻辑结构(LBA寻址),详细解析了ext2文件系统的组织方式,包括超级块、块组描述符、inode表等核心概念。重点分析了inode如何关联数据块、文件名与inode的映射关系,以及Linux通过dentry缓存优化路径查找的机制。最后对比了软硬链接的实现差异:软链接是独立文件存储目标路径,硬链接则是共享inode的多个文件名映射。文章通过代码实验和理论分析,完整呈现了文件
2025-10-01 20:18:05
710
原创 Linux 缓冲区与glibc库
本文深入探讨了Linux系统中的文件I/O机制,重点分析了缓冲区的实现原理。主要内容包括:1)标准输入/输出/错误流的重定向操作及其异常现象解析;2)文件描述符表files_struct和file结构体的内部组成;3)Linux"一切皆文件"的设计理念及其多态实现;4)缓冲区的类型、作用机制及刷新策略;5)通过模拟实现C标准库文件接口,展示了语言层缓冲区与内核缓冲区的交互过程。文章通过代码示例和实验现象,揭示了用户层缓冲区与内核缓冲区的差异,以及缓冲区在提高I/O效率方面的重要作用。
2025-09-29 21:21:12
661
原创 Linux 基础IO与系统IO
本文系统介绍了文件系统的基础IO与系统IO操作。首先从文件本质(属性+内容)和进程对文件的操作入手,详细讲解了C语言层面的文件读写接口(fopen/fwrite/fread等)及其实现原理。随后深入系统级IO,解析open/write/read/close等系统调用的使用方法和底层机制,特别是文件描述符fd的本质(内核数组索引)和重定向原理(通过dup2修改指针指向)。文章还通过代码示例演示了如何实现简单shell的重定向功能,并分析了进程替换不影响重定向的原因。最后讨论了不同语言对系统调用的封装如何实现跨
2025-09-28 21:48:04
1202
3
原创 Linux 自定义shell命令解释器
本文实现了一个简易的自定义bash shell,主要功能包括:1. 环境变量管理:通过InitEnv()初始化环境变量表,支持从父进程继承环境变量;2. 命令行解析:使用CommandParse()将用户输入的命令按空格分割为参数数组;3. 内建命令实现:支持cd、echo等内建命令,直接在当前进程执行;4. 外部命令执行:通过fork()+execvp()执行外部命令,父进程使用waitpid()等待;5. 交互式界面:显示包含用户名、主机名和当前目录的提示符,支持循环读取和执行命令。该实现重点演示了环境
2025-09-27 16:38:55
1128
2
原创 Linux 进程程序替换
本章介绍了进程程序替换的相关内容,主要包括:1. 通过execl函数演示程序替换效果,展示子进程执行新程序后原程序代码被覆盖的现象;2. 解释程序替换原理是覆盖当前进程的代码和数据段,不创建新进程;3. 详细讲解exec系列函数(execl/execlp/execv/execvpe等)的使用方法及区别;4. 说明如何通过子进程执行程序替换而不影响父进程;5. 演示如何传递命令行参数和环境变量,并说明环境变量的继承机制。最后指出exec系列函数最终都会调用execve系统调用,为后续实现简单shell程序打下
2025-09-26 17:08:58
1356
1
原创 C++ 反向迭代器模拟实现
摘要: 本文详细分析了C++中反向迭代器的实现机制。反向迭代器本质上是基于正向迭代器的适配器,通过模板技术实现。SGI-STL3.0版本提供了两种实现方式:支持偏特化的新版本(reverse_iterator)和旧版本(reverse_bidirectional_iterator)。核心实现包括operator*返回前一个位置、operator++调用正向迭代器的operator--等关键操作。文章还展示了如何在list和vector容器中适配反向迭代器,重点说明了rbegin()和rend()的实现逻辑,
2025-09-25 22:54:00
1175
原创 Git 多人协作(2)
本文演示了Git多人协作开发流程:开发者1在feature-1分支开发function1,开发者2在feature-2分支开发function2。通过创建远程分支、推送修改等操作后,遇到开发者2无法继续工作的情况,开发者1接手完善feature-2分支并推送。最后将两个功能分支合并到master,展示了完整的协作开发过程,包括分支创建、代码同步、冲突处理等关键操作。案例说明了Git分支管理在实际协作中的灵活应用。
2025-09-25 21:57:31
691
原创 Linux 进程控制
本文主要介绍了Linux进程控制的相关知识,包括进程状态、进程创建、进程终止和进程等待四个部分。首先阐述了进程状态与进程控制的关系,静态状态描述进程当前状况,而动态控制则管理状态转换;然后详细讲解了fork()函数和写时拷贝机制,分析了其工作原理和优势;接着介绍了进程终止的三种场景和退出码机制,比较了exit和_exit的区别;最后重点讲解了进程等待的必要性及其实现方式,包括wait()和waitpid()函数的使用,以及如何通过status参数获取子进程退出信息。文章通过代码示例展示了僵尸进程的产生和处理
2025-09-24 16:53:03
779
3
原创 Linux 进程地址空间
本文深入探讨了Linux进程地址空间机制。通过全局变量gval的写时拷贝问题,阐述了进程地址空间的本质:每个进程拥有独立的虚拟地址空间(32位4GB,64位更大),通过页表映射到物理内存。重点分析了写时拷贝技术如何实现进程独立性,以及mm_struct数据结构如何管理虚拟地址空间的区域划分。文章还解释了虚拟地址空间的五大优势:使内存访问有序化、提供权限保护、防止野指针、支持动态加载、实现进程管理解耦。最后介绍了vm_area_struct结构体如何管理离散的堆空间,以及进程独立性实现的根本原理。整个机制体现
2025-09-23 15:44:20
699
1
原创 Linux 环境变量与程序地址空间
本文主要探讨了Linux系统中的环境变量和程序地址空间两大主题。在环境变量部分,详细介绍了其概念、作用及操作方式,包括PATH变量的功能、环境变量的全局特性、获取方法(命令行参数、getenv函数、environ变量)以及相关配置文件的加载机制。在程序地址空间部分,通过代码实验验证了不同变量在地址空间中的分布,并揭示了程序地址空间实际上是虚拟地址空间而非物理内存空间的事实,通过父子进程中相同变量地址但不同值的现象,证明了虚拟地址的存在。文章还探讨了环境变量在进程间传递和控制程序行为中的应用,以及本地变量与环
2025-09-22 20:32:01
792
2
原创 Linux 孤儿进程与进程的优先级和切换和调度
本文主要探讨了Linux系统中的孤儿进程和进程优先级调度机制。首先解释了孤儿进程的概念,即父进程终止后由init进程(1号进程)接管,并通过代码演示了孤儿进程的产生和处理方式。其次详细介绍了进程优先级(PRI和nice值)的作用、调整方法及取值范围限制(60-99)。最后深入分析了进程调度算法,包括时间片轮转、优先级队列(active和expired)的设计原理,以及O(1)调度器如何通过位图和双队列机制实现高效公平的进程调度。这些机制共同确保了系统在多进程环境下能够合理分配CPU资源,避免进程饥饿问题。
2025-09-21 17:40:16
1444
原创 Linux 进程状态
本文系统讲解了操作系统中的进程状态及其在Linux中的具体实现。主要内容包括:1)进程状态概念,重点解析运行态、阻塞态和挂起态的本质;2)Linux特有状态如追踪态、深度休眠态、僵尸态的实现原理;3)通过代码示例演示不同状态的表现形式;4)深入剖析Linux内核链表设计如何实现PCB在多个队列中流动;5)讨论僵尸进程导致的内存泄漏问题及其解决方案。文章结合理论分析与实践演示,揭示了进程状态变化的底层机制。
2025-09-20 21:17:26
979
1
原创 Linux 冯诺依曼体系结构与进程理解
文章摘要: 本文系统介绍了计算机系统架构与操作系统核心概念。首先阐述冯诺依曼体系结构,包括以存储器为中心的五大部件、存储程序思想及数据流动过程。其次讲解操作系统定义与功能,强调其作为软硬件资源管理者的角色,分析"先描述再组织"的设计理念。最后深入探讨进程概念,包括进程控制块(PCB)、父子进程关系、进程创建(fork)机制及写时复制技术。通过银行系统等类比,帮助理解计算机系统各层级的抽象与管理机制。
2025-09-19 22:00:07
1007
3
原创 Git 多人协作(1)
标签管理: 使用git tag <name>创建轻量标签,默认标记最新提交 通过git tag -a <name> -m "message"创建带注释的标签 支持查看(git show)、删除(git tag -d)标签操作 可通过git push origin <tagname>推送单个标签,或git push origin --tags推送所有标签 多人协作实操
2025-09-18 22:18:42
1346
原创 Linux 开发工具(3)
本文介绍了Linux下的gdb调试工具使用指南。主要内容包括:1)gdb的基本概念和作用,强调调试是发现而非解决问题的过程;2)debug版本编译方法,需使用-g选项生成包含调试信息的可执行文件;3)常用gdb命令如设置断点(b)、单步执行(n/s)、查看变量(p)、监控变量(display)等;4)进阶调试技巧,包括条件断点、变量监控(watch)、修改变量值(setvar)等;5)通过求和函数示例演示如何定位和修复代码逻辑错误。文章还对比了gdb与cgdb的区别,并提供了Makefile编写示例。调试的
2025-09-18 18:46:52
1176
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅