自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个小孩

不慕将军百战成功名,愿效滴水洞石穿。

  • 博客(620)
  • 收藏
  • 关注

原创 常用Linux指令——dd

【代码】常用Linux指令——dd。

2026-10-23 19:29:49 216

原创 Linux指令——Sed和Awk指令关键用法记录

sed 会替换和删行,awk 会取列、改分隔符、END 统计,日常运维和日志处理基本够用。剩下的,Vim 管精细修改,Python 管复杂逻辑。在日常开发中,有很多方法可以作文件内容的增删改查,但是没必要每个都会,只需要根据不同的场景选择不同的方法即可。Linux 文本三剑客 grep / sed / awk,新手很容易陷入"背全量语法"的陷阱。的意思是:所有行处理完之后,最后执行一次。,剩下的交给 Vim 和 Python。预览,确认删的是你想删的行。语法不同,下面会单独标注。,最后打印时间和错误码。

2026-10-11 23:29:39 106

原创 串口调试踩坑日记——stty后处理、echo、printf、串口

1. echo 与 printfecho -e虽然能解析转义,但默认追加换行;串口二进制指令优先用printf,字节可控、跨平台稳定。2. stty 与 TTY 行规程stty 配置串口内核行规程。人机交互用默认配置;串口协议通信必须切 raw,关掉所有自动字符替换、行缓冲和回显。类别关键选项二进制串口推荐配置输出处理-opost-onlcr输入处理icrnl、ixon-icrnl-ixon本地终端-echo-icanon-isig串口控制保持 8N1硬件流控crtscts不需要则。

2026-10-11 21:48:53 465

原创 查看网卡配置连接工具组合——nmcli + nmtui

查看状态、启停连接这种简单操作直接敲 nmcli;遇到配置项多、容易写错参数的场景,打开 nmtui 可视化填写,减少手敲命令出错。nmtui 本质也是调用 NetworkManager,保存的配置文件和 nmcli 完全一致。两者修改的是同一套配置,可以互相配合使用,互不冲突。适合 SSH 远程,输出可以管道过滤,方便快速排查网络状态,适合简单指令。终端输入即可启动,SSH 远程也能用,TUI 菜单可视化填表。,NM 不会接管,两个工具都无法修改网卡配置。很多人会纠结二选一。重要提醒:这两个工具。

2026-10-09 21:09:14 176

原创 进程监控工具——htop

htop是一款交互式进程查看器,作为经典top命令的现代化替代品。top是 Linux 自带,但界面简陋、操作不友好;htop 用彩色界面、鼠标支持、快捷键、横向滚动查看长命令行,能直观看到 CPU / 内存负载、进程树,适合快速定位 CPU 打满、内存泄漏、僵死进程。htop 是 Linux 性能调试的入门利器,替代 top 做日常监控。htop 打开,看 CPU / 内存整体状态P/M 排序找到占用高进程F5 打开进程树看父子关系F4 过滤进程,H 隐藏多余线程。

2026-10-09 20:51:41 346

原创 Linux系统中/proc/diskstats文件字段解析

proc/diskstats 是 Linux 内核导出的虚拟文件,用于实时展示系统中所有块设备的 I/O 统计信息,是排查磁盘性能瓶颈、评估磁盘健康状态的核心工具。本文根据我电脑的 diskstats 数据,按设备类型逐行解析字段含义,结合数据特征总结磁盘整体状态,为系统优化提供参考。

2026-08-10 23:12:02 358

原创 Linux系统/proc/cpuinfo 文件字段与内容解析

proc/cpuinfo 是 Linux 内核导出的虚拟文件(不占用实际磁盘空间),用于实时展示系统中 CPU 的硬件信息、性能参数、特性标识及拓扑结构,是排查 CPU 相关问题、确认硬件配置、优化系统性能的核心工具,其内容会随 CPU 硬件和内核配置动态变化。

2026-08-10 17:35:00 220

原创 Linux系统内存管理算法Buddy及排查内存碎片化的方法

碎片特征:低 order(0-4)空闲块数量多,高阶(5-10)空闲块为0,此时系统整体内存充足,但无法分配连续物理内存,易导致 DMA 分配、HugePage 分配失败。核心逻辑:归还内存块后,循环查找其伙伴块,若伙伴块满足空闲条件,则合并为更高阶的大块,持续向上合并直到无法合并,最终将合并后的块插入对应阶数的空闲链表,以此缓解外部碎片。核心逻辑:若目标阶数无空闲块,则向上寻找更高阶的空闲大块,将其对半拆分,多余的小块放回对应阶数的空闲链表,直到得到目标大小的内存块。开始分配,目标order = n。

2026-08-10 16:56:36 288

原创 Linux系统/proc/meminfo文件解析

做 Linux 后台、自动驾驶域控、IPC 开发时,排查内存泄漏、OOM、系统卡顿,/proc/meminfo 是最权威的一手数据源,free、top 命令的数据本质全部来源于该虚拟文件。很多新手只看 MemFree 空闲内存判断内存是否紧张,经常被「空闲内存很少、缓存占用巨大」的现象误导。本文结合 Ubuntu 主机真实内存快照,逐项拆解内存构成、系统内存健康度,并结合开发场景给出排查思路与优化建议。

2026-08-09 23:57:37 361

原创 Nanomsg终篇——分层架构总结

上层 API 极其简单 nn_socket / nn_send / nn_recv / nn_closenn_sock 中枢调度 FSM 根 + 事件路由 + 选项分发协议层 策略多样 pub/sub 用过滤树,req/rep 用 lb+fq,survey 用超时pipebase 桥梁抽象 协议层和传输层在此交汇sipc/aipc 复杂的异步 accept/connect/握手/分帧/流控/重连bipc/cipc 连接管理 全部是 FSM 状态机。

2026-08-09 23:03:11 420

原创 Linux 系统监控核心:/proc/stat 文件全解析

proc/stat 位于 /proc 目录下,proc 文件系统是 Linux 特有的虚拟文件系统,不占用实际磁盘空间,文件内容由内核实时生成,反映系统当前运行状态。/proc/stat 中的所有数值均为自系统启动以来的累计值,单位为 jiffies(内核节拍,通常 1 jiffies = 0.01 秒,具体取决于内核配置)通过命令即可查看文件内容,输出格式分为多行,核心包括 CPU 统计行、中断行、上下文切换行、启动时间行、进程统计行等,不同内核版本字段略有差异,但核心字段保持一致。

2026-08-09 18:56:50 519 1

原创 Nanomsg 核心模块Endpoint解析

用 C 语言手工实现了一套以内存字段分发的异步事件系统。函数只是"解释器",真正决定程序走向的是结构体里那些int和函数指针——每次状态切换、每次事件路由,都是靠读写内存中的字段来完成,而不是靠调用栈。在这个框架里,ep(endpoint,端点)模块代码量很少,却处于一个非常关键的位置——它是 socket 和传输层之间的"桥梁"。理解它,是理解整个 nanomsg 分层架构的钥匙。ep 是 socket 和传输层之间的生命周期协调整,它不是执行者,是指挥者。维度ep 的表现数据收发。

2026-08-04 00:10:57 307

原创 Nanomsg库AIO模块学习心得

所有业务逻辑全部收敛在 FSM(有限状态机)内部,依靠状态流转、事件分支完成业务处理。框架通过 nn_ctx_enter / nn_ctx_leave 上下文锁机制做保障:同一个 FSM 实例,永远只会被单个 Worker 线程执行。开发者完全可以用单线程思维编写状态机逻辑,不需要手动加锁处理多线程竞态,绝大多数并发 Bug 在架构层面直接被规避。两层唯一通信桥梁:owner 状态机指针 + src 来源编号 + nn_fsm_feed() 投递接口。

2026-08-02 19:56:34 319

原创 Nanomsg中pubsub_demo详解

传输层由 URL 决定,不需要在代码中显式选择——tcp://即 TCP,ipc://即 Unix 域套接字没有 accept——bind 后直接发,connect 后直接收,异步 IO 在框架内部处理是必选项——忘记设置会导致永久收不到消息二进制消息必须处理字节序——htonl编码、ntohl解码PUB 端即使没有订阅者也会继续运行——这是发布/订阅模式与 REQ/REP 的根本区别同一个可执行文件,-s参数切换角色——这是一种整洁的程序设计模式。

2026-07-12 23:32:32 212

原创 Nanomsg中nn_sock的设计与实现

模式在 nn_sock 中的体现FSM 状态机5 状态生命周期,handler + shutdown 双回调C 多态(虚函数表)ep->ops懒惰初始化按需创建传输层选项RCU 式延迟回收holds引用计数 +sdeps延迟释放队列双链表管理eps(活跃) /sdeps(关闭中)事件通知eventfd (sndfd/rcvfd) + poll/epoll 兼容临界区onleave回调绝对超时deadline 时间戳避免信号中断导致时间漂移双重检查efd wait 返回后立即非阻塞再检查。

2026-07-12 22:38:52 326

原创 C++工程实战: 预处理宏、宏重定义避坑、LOG_TAG业务实践与__COUNTER__深度解析

业务开发、Android Native、ROS开发高频场景:公共日志头文件统一定义全局LOG_TAG,多cpp文件需要自定义模块标签区分日志;直接重复定义会触发编译告警,严格编译策略下直接编译失败。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;被多CPP include业务层直接#define 同名宏解决方案分支解决方案分支解决方案分支。

2026-07-07 23:16:58 605

原创 nanomsg 核心引擎:global.c设计思路解析

单一全局锁的简洁性:不同于需要细粒度锁的通用 socket 库,nanomsg 选择对全局表加一把大锁。在 ≤512 sockets 的场景下,这避免了锁竞争的复杂性且性能尚可。惰性初始化的资源友好:如果不使用 nanomsg,连内存都不分配。这对嵌入式场景和库作为可选依赖的应用非常友好。编号栈复用:用栈实现 O(1) 的 socket 编号分配和回收,同时保持编号紧凑便于调试。hold/release 保护模型:通过引用计数保证异步操作中 socket 对象不会被提前释放,而无需让调用者自己管理生命周期。

2026-07-06 23:30:01 509

原创 Nanomsg中ReqRep协议的实现思路

REQ/REP 的核心不是“消息转发”,而是“请求响应协议的状态管理”。REQ 端负责发请求、等回复、识别回复、重发和取消旧请求;REP 端负责保存请求上下文,并在回复时将其正确送回;两者共同构成了一套完整的请求/响应语义层。如果把这套实现浓缩成一句话,可以说:REQ/REP 是一套在 XREQ/XREP 之上构建出的、以状态机和上下文为核心的请求响应协议框架。

2026-07-06 00:17:55 256

原创 C++ 无锁编程:内存序(acquire/release)和CAS强弱语义学习记录

atomic 只管原子撕裂,不管顺序和可见性release 写屏障:之前操作不后移,数据先于标记acquire 读屏障:之后操作不前移,标记先于数据release-acquire 配对,是无锁IPC、SHM 最优轻量同步方案。

2026-07-01 23:27:50 448

原创 C++ 线程优雅退出终极避坑

原子 bool 标记循环 + 析构置位 false + join 等待退出// 其实没有阻塞的话,线程知识做计算,这种方式是可以退出的这套代码看起来完全没问题:原子变量保证线程安全、join 杜绝线程资源泄漏、析构统一兜底清理。该模型仅适用于纯CPU运算线程,一旦存在任何阻塞IO,优雅退出直接失效。kill -15无法正常退出、进程卡死、systemd 5秒超时发送 SIGKILL 强杀、缓存未刷盘、日志丢失、句柄泄漏。本文从零拆解所有层级坑点,纠正全网错误Demo,给出。

2026-07-01 21:19:34 370

原创 解析 GCC 符号可见性:__attribute__((visibility(“default“)))

很多开发者仅知道这行代码用于导出函数/变量,但并不清楚其底层原理、适用场景、配套规则、优缺点以及工程最佳实践。本文将从零开始,全方位拆解visibility 可见性属性,重点详解,搭配语法解析、底层机制、代码实战、避坑指南、工程规范,彻底吃透这一 Linux 开发核心知识点。是GCC/Clang 编译器专属扩展语法,不属于 C/C++ 标准语法,是编译器提供的代码属性修饰器。给函数、全局变量、结构体、类等代码实体附加特殊编译特性,指导编译器在编译、链接、符号导出阶段做定制化处理。

2026-06-30 23:24:06 507

原创 Nanomsg中REQ/REP协议

Nanomsg REQ/REP 整套体系,是一套分层清晰、职责单一、极致解耦XREQ/XREP 底层层:解决「通路、调度、路由」问题,用 FQ 队列解决并发读、用 Hash 表解决精准写,实现无状态传输;REQ/REP 上层层:解决「有序、可靠、业务安全」问题,用状态机和标记位锁死时序,用 ID 校验保证请求应答一一对应;分层协作:底层不关心业务,上层不关心传输,各司其职,既保留裸协议的高性能与扩展性,又拥有业务协议的规范性与可靠性。

2026-06-22 00:20:40 365

原创 Nanomsg中PUB/SUB 发布订阅架构

单向通信:禁用接收,nn_xpub_in直接断言报错,杜绝非法消息流入;无状态分发:不维护订阅列表、不解析消息内容,纯转发逻辑;就绪驱动:仅向可写就绪管道推送消息,避免阻塞、缓冲区溢出;极致高性能:零计算、零匹配、零过滤,发布吞吐能力拉满。

2026-06-21 19:15:36 388

原创 Nanomsg 自适应 Patricia 前缀树——极简极致的 Pub/Sub 匹配引擎

在消息中间件、进程间通信、轻量 Pub/Sub 场景中,主题前缀匹配是最核心的高频操作。MQTT、nanomsg、zeromq 等轻量化消息框架,均依赖前缀树实现消息过滤。大多数开发者熟知普通字典树(Trie),但其存在严重的内存冗余问题;而常规压缩前缀树(Patricia Trie)又难以兼顾少量订阅省内存、海量订阅高查询速度的双重需求。今天我们深度剖析nanomsg 自研自适应 Patricia 前缀树(nn_trie)

2026-06-21 18:27:13 409

原创 Nanomsg源码中pipeline协议模式

最后做一个极简复盘,方便大家快速记忆和复用:1. PUSH/PULL 是纯单向流水线协议,PUSH 只发不收、PULL 只收不发,天然适配生产消费架构;2. 打破传统 Socket 一对一限制,单 Socket 可管理多条物理连接,支持大规模节点集群;3. 核心双引擎:PUSH 端 LB 负载均衡分发任务,PULL 端 FQ 公平队列汇总消费;4. 和广播模式本质区别:单任务单节点消费,无重复、无丢失;5. xpush/xpull 无锁设计,高并发高性能,是轻量化任务调度的最优选择。

2026-06-18 00:11:23 391

原创 C++ wait_for 致命陷阱:系统时间跳变导致永久死根因及解决办法

是相对时间等待基于steady_clock(单调时钟)不受系统时间修改、NTP 回拨、手动 date 调整影响绝大多数业务代码、框架、中间件都依赖这个认知。当运维校准时间、NTP 回拨、手动改系统时间后:本该等待 5s 的逻辑,瞬间超时返回或直接永久卡死、无限死等代码完全标准、无 Bug、写法教科书级别,却概率性致命卡死。这不是业务 Bug,是 C++ 标准与 Linux POSIX 实现的底层冲突。C++ 标准是对的,但 Linux libstdc++ 旧实现是错的。

2026-06-17 22:43:39 643

原创 Nanomsg 协议BUS及相关数据结构详解

核心作用:BUS、PUB协议通用出方向管道管理器。负责维护对外可发送的pipe链表,实现消息一对多广播、指定管道屏蔽、链路异常自动剔除。BUS发送消息完全依赖该结构,无额外发送逻辑。// 单管道链表节点:绑定单个出方向管道// 侵入式链表挂载点,接入dist的pipes链表// 指向TCP/IPC物理连接管道(出方向)// 分发器主体// 就绪出管道数量,O(1)读取,避免链表遍历// 就绪管道双向链表头。

2026-06-17 00:08:49 380

原创 一个通用的异步任务提交器

多线程编程中,我们经常要把一个函数扔到线程池里执行。但很快你就会碰到两个需求,1)函数需要参数:比如 print(“hello”, 42);2)需要获取返回值:比如 int result = add(3,5);但要在另一个线程执行。用原生 std::thread 很难优雅地解决这两个问题,而 std::packaged_task + std::future + 万能引用的组合可以完美解决。

2026-06-10 23:57:27 249

原创 从源码角度分析nanomsg 协议层设计

protocol.h 是协议模块的顶层规范,它声明了所有协议必须遵循的数据结构和回调函数。int domain;// 地址族,如 AF_SP// 协议编号,如 NN_PAIRint flags;// 标志位(NN_SOCKTYPE_FLAG_NORECV / NOSEND)每个协议模块(如 pair.c)都需要定义一个该类型的全局变量,用来告诉内核自己的“身份信息”和工厂方法。

2026-06-10 00:10:17 362

原创 Nanomsg 源码深剖:transport.h 传输层架构规范 + IPC 传输完整落地实现

TCP、IPC、INPROC 这些不同的底层传输,为什么可以无缝适配所有上层协议(Pair/REQ/PUB/SUB)?。是 Nanomsg整个传输子系统的顶层规范、接口契约、架构基石。它彻底定义了:什么是传输层(Transport)?什么是端点(Endpoint)?什么是管道(Pipe)?传输层必须实现哪些接口、遵循哪些状态机规则?内核如何统一调度 TCP/IPC/INPROC 不同传输?本文将逐结构体、逐函数、逐设计思想解析,并结合你已经掌握的IPC 全套源码,做规范与实现的一一映射。

2026-06-07 23:51:46 385

原创 Nanomsg 源码深度剖析:从 protocol.h 内核抽象到 Pair 一对一通信全实现

基于protocol.h的内核规范,xpair.h定义了 Pair 专属结构体,完成基类继承 + 业务字段扩展。/* 继承套接字基类,拥有所有内核统一能力 *//* Pair 核心:唯一管道,严格一对一的根源 */依托protocol.h的内核抽象设计,Pair 协议做到了极致精简、高可靠、高实时一对一强制约束:由内核管道绑定机制实现,无业务容错漏洞;全双工自由通信:无收发顺序、无状态限制,是纯粹的双向透明通道;完全解耦架构。

2026-06-07 23:51:09 369

原创 Nanomsg usock 模块:Socket 选项与错误码介绍

Nanomsg usock 模块通过精细地运用这些选项和处理各类错误,构建了一个跨平台、非阻塞、高效可靠的异步 I/O 层。常用的SO_NOSIGPIPE、SOCK_CLOEXEC、TCP_NODELAY、EPIPE / ECONNRESET、EAGAIN / EINPROGRESS一定要牢记,EPIPE / ECONNRESET表示连接错误 标识连接异常断开,EAGAIN / EINPROGRESS表示在非阻塞状态,操作需要等待,不是真正的错误。

2026-06-01 22:48:05 395

原创 Nanomsg中usock模块状态机详解:客户端与服务端视角

usock 模块通过精细的状态机设计,将异步 socket 的复杂行为分解为清晰的状态和转换。客户端 socket 专注于连接建立和 I/O;服务端监听 socket 专注于接受连接,并容忍临时资源枯竭;被接受 socket 则复用客户端 socket 的 ACTIVE 状态处理数据传输。

2026-06-01 00:39:28 447

原创 Nanomsg中的usock:一个高效的异步 Socket 封装

Nanomsg 库中的 usock 模块(src/core/usock.h 和 usock_posix.c)提供了一套优雅的异步 socket 抽象,基于状态机和 worker 线程模型,让上层协议无需关心底层 I/O 的复杂性。

2026-05-31 23:48:42 359

原创 Nanomsg 异步 I/O 引擎:Timer、TimerSet 与 Worker 的协作内幕

状态机与线程分离,每个 nn_timer 都有自己的状态机,但状态机的执行(handler 被调用)永远发生在 Worker 线程的上下文中任务队列解耦跨线程调用,上层线程(例如用户调用 nn_timer_start)并不会直接操作 timerset,而是通过 nn_worker_execute 投递任务。Worker 线程在自己的主循环中安全地修改 timerset,避免了锁竞争。

2026-05-28 00:20:48 373

原创 Nanomsg中间件utils中部分工具学习记录

这个宏是嵌入式、linux内核中最经典、最核心的宏之一,官方标准名叫container_of,Nanomsg中改名叫nn_cont,其功能完全一样。它的作用是,**通过结构体中某个成员变量的指针,反推出整个结构体变量的首地址。?charoffsetofNULL其中offsetof(type, member)是标准库宏,其作用就是计算一个成员在结构体中的字节偏移量,offsetof(struct student, age) 结果就是 14。

2026-05-23 00:31:15 409

原创 pthread 互斥锁属性:type、pshared 与 robust

settype 回答:同一线程能否重复加锁?解锁检查所有权吗?setpshared 回答:锁只给自己线程用,还是给别的进程用?setrobust 回答:如果锁的主人死了,其他等待者怎么办?

2026-05-20 00:02:47 396

原创 Linux 时间:从原子钟到 clock_gettime 的每一面

时间测量最精确的基准来自于原子物理学。1967 年,国际计量大会定义秒的长度为:铯-133 原子基态的两个超精细能级间跃迁辐射振荡 9,192,631,770 周所持续的时间。基于这个定义,全球数十个实验室的原子钟共同加权平均,形成了 国际原子时(TAI)。

2026-05-19 00:24:56 370

原创 Git Describe 与 TRAVIS_TAG学习笔记

Travis CI 内置环境变量,;非标签触发的构建(如提交代码、合并分支),该变量为空。在推送tag到云端服务器时,TRAVIS_TAG会临时生成为云端服务器的环境变量,在云端使用。

2026-05-17 23:16:52 105

原创 Nanomsg中对I/O多路复用的封装

在网络编程中,I/O 多路复用是高性能服务端的基础能力:通过监听多个文件描述符(socket、管道等),在事件到达时高效唤醒执行。但不同操作系统的 I/O 多路复用机制并不统一,Linux系统使用epoll,BSD/macOS系统使用kqueue,poll可以最为备选方案用于不支持epoll和kqueue的系统。为了保证跨平台统一接口、同时不牺牲性能,需要对以上机制进行良好封装。Nanomsg(高性能消息库)内部的 nn_poller 模块就是这样一个典型案例。

2025-12-10 00:27:01 1001

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除