让 Lua 插上翅膀:C 与 Lua 是怎么绑在一起的

Posted on 四 01 10月 2026 in Tech • Tagged with tech, lua, c, ffi, swig, freeswitch, openresty, luajit

Lua 自己什么都不会——不会发网络请求,不会读数据库,连打开一个文件都得靠宿主给的库。它小得可怜,却长在魔兽世界、Nginx、Redis、FreeSWITCH 这些庞然大物里,靠的就是一件事:跟 C 无缝对接,借用整个 C/C++ 生态。这篇讲清楚 C 和 Lua 到底是怎么绑在一起的——从那个来回倒数据的栈,到注册 C 函数、包装 C 对象,再落到两种真实风格:FreeSWITCH 用 SWIG 预生成胶水,OpenResty 用 LuaJIT FFI 干脆不写胶水。代码引用来自 FreeSWITCH master 分支与 LuaJIT 官方文档。


Continue reading

FreeSWITCH 的 session:一次呼叫的生老病死,都装在一个容器里

Posted on 六 19 9月 2026 in Tech • Tagged with tech, freeswitch, session, lifecycle, memory-pool, voip, c

FreeSWITCH 的 session 是整个系统最核心的抽象——它是一路呼叫的容器,也是它的边界。这篇顺着源码,把一次呼叫从 SIP INVITE 进来、到 session 创建、媒体协商、桥接、挂断销毁的完整生命周期讲清楚:哪些数据是线程私有、哪些是共享,session 为什么和内存池、线程死死绑在一起,以及为什么"把会话从服务器 A 迁到服务器 B"这条路基本走不通——真要做会话漂移,让客户端 endpoint 重连新服务器,比在服务端桥接靠谱得多。


Continue reading

FreeSWITCH 架构设计之快与脆

Posted on 五 18 9月 2026 in Tech • Tagged with tech, freeswitch, architecture, voip, webrtc, sfu, c

FreeSWITCH 用 switch_core 内核加模块插件的方式把一整套电话系统塞进一个进程,既不拆成微服务,也不是简单的单进程多线程。这篇从源码层面讲清它的状态边界划在哪、这种结构为什么快、又为什么脆,以及为什么这套二十年前为语音打磨的架构,做不成今天意义上的高性能 SFU。


Continue reading

给 FreeSWITCH 写测试:从单元测试到集成测试,用一个真 bug 串起来

Posted on 四 10 9月 2026 in Tech • Tagged with tech, freeswitch, testing, unit-test, integration-test, c, pcre2, sipp

给 FreeSWITCH 写测试有两条路:一条是自带的 FST 框架,起一个真 core、真 session,在进程内测 switch_* 函数;另一条是拉起整个服务、用 SIPp 打真呼叫、看 ESL 事件的集成测试。本文用我修的一个 mod_dialplan_xml use-after-free bug(PR #3151)串起前者,再讲清后者什么时候非用不可、怎么搭、坑在哪,最后给一张"这个 bug 该写哪种测试"的决策表和检查清单。


Continue reading

C 插件系统实战指南:dlopen 没告诉你的四件事

Posted on 一 07 9月 2026 in Tech • Tagged with tech, C, dlopen, plugin, so, abi, dynamic-linking, best-practice

dlopen 只有四个函数,半小时能学完。难的是它没管的四件事——入口点怎么找、插件怎么回调宿主、ABI 怎么不崩、卸载怎么办。这篇把这四个问题的传统答案讲清楚,给一份可编译运行的完整参考实现(357 行),再用 10 个实测的崩溃现场说明常见错误。含 Linux/macOS 差异对照和一份可勾选的 checklist。


Continue reading

C 语言的动态加载、依赖注入与服务注册:把 FreeSWITCH 的模块机制拆到底

Posted on 一 07 9月 2026 in Tech • Tagged with tech, C, freeswitch, dlopen, plugin, dependency-injection, service-registry, abi

C 没有反射,凭什么能用字符串 "answer" 找到一个函数?把 FreeSWITCH 的模块系统从 dlopen 拆到函数指针派发,四层结构讲透:动态加载、依赖注入、服务注册、运行时查找。所有结论都在 FreeSWITCH 1.11.3-dev 上实测过,包括亲手写一个 50 行模块热加载进跑着的进程,以及三个实测出来的坑。


Continue reading

APR 入门:一个 30 年前的答案,为什么还在你的代码库里

Posted on 日 06 9月 2026 in Tech • Tagged with tech, C, APR, apache, freeswitch, memory-pool, portability

APR(Apache Portable Runtime)是 C 语言事实上的"缺失标准库",它的核心是内存池——不追踪每个对象的释放,而是按生命周期批量丢弃。这篇讲清 APR 的设计理念、常用模块、快速上手路径、以及 FreeSWITCH 为什么要把它 fork 出来改名。所有代码在 APR 1.7.6 上实测。


Continue reading

C++ 悬垂引用与 lambda 捕获:语法上最省事,出事时最难查

Posted on 六 05 9月 2026 in Tech • Tagged with tech, C++, memory, reference, lambda, dangling, sanitizer, modern-cpp

引用和 lambda 捕获是 C++ 里最省事的两个语法,也是最容易悄悄出事的两个。悬垂引用在使用处和普通变量一模一样,还没有"空"这个状态可判;[=] 看着像全按值拷,其实按指针捕了 this。本文用九个能编译运行的实例,讲清悬垂引用的四种来源、lambda 捕获的五种误用、什么时候该用引用什么时候不该用,附一张捕获速查表和检查清单。


Continue reading

C/C++ 内存管理方法的变迁:把纪律写进类型系统

Posted on 五 04 9月 2026 in Tech • Tagged with tech, C, C++, memory, RAII, smart-pointer, modern-cpp

从 malloc/free 到 unique_ptr,再到 span 与 pmr,C/C++ 三十年的内存管理演进有一条清晰的主线:把原来只能靠人记住的纪律,一点点搬进类型系统,让编译器去查。本文按 C、C++98、C++11、C++17/20 四个阶段讲清各自的特点与难点,配可编译运行的实例、最佳实践、常见陷阱和一张检查清单。


Continue reading

C/C++ 内存管理方法的变迁:把纪律写进类型系统

Posted on 五 04 9月 2026 in Tech • Tagged with tech, C, C++, memory, RAII, smart-pointer, modern-cpp

从 malloc/free 到 unique_ptr,再到 span 与 pmr,C/C++ 三十年的内存管理演进有一条清晰的主线:把原来只能靠人记住的纪律,一点点搬进类型系统,让编译器去查。本文按 C、C++98、C++11、C++17/20 四个阶段讲清各自的特点与难点,配可编译运行的实例、最佳实践、常见陷阱和一张检查清单。


Continue reading

一个字符串引发的血案:从 C 到 Go 的 rune,字符串是怎么一步步进化的

Posted on 一 06 7月 2026 in Tech • Tagged with string, unicode, c, cpp, java, python, go, rune, encoding

字符串看着最简单,坑却最深。从 C 的一根 char 指针,到 C++ 的 std::string,到 Java/Python 的对象化,再到 Go 的 rune,这一路演进本质上就在解决三个问题:谁管内存、长度怎么算、一个"字"到底是什么。这篇按时间线把它们串起来,讲清楚每一步为什么这么设计、又留下了什么坑。


Continue reading

生锈的知识,还能不能重新上场?

Posted on 二 30 6月 2026 in Tech • Tagged with AI, C++, audio-video, learning, knowledge-management, engineering

长久不用的知识会不会生锈?会。但真正危险的不是忘了细节,而是把生锈的手感误认为仍在巅峰。以大型 C++ 和 Audio/Video 项目为例,聊聊怎样让知识重新招之即来、来之能战。


Continue reading

Debug Build 的两种哲学:C++ 宏 vs Go 链接器注入

Posted on 二 03 2月 2026 in Tech • Tagged with C++, Go, build, debugging, compilation, best-practices

从 C++ 的 -DDEBUG 宏到 Go 的 -ldflags -X,聊聊两种语言在"条件编译"上的不同哲学,以及 Go 独有的 Build Tags 玩法。


Continue reading

C 与 C++:一对父子的渐行渐远

Posted on 六 17 1月 2026 in Tech • Tagged with C, C++

很多人以为 C++ 就是 "C with Classes",但现代 C++ 早已面目全非。本文带你梳理 C 和 C++ 的核心差异,以及 C++11 到 C++23 的革命性变化——如果你还在写 C++98 风格的代码,是时候升级了。


Continue reading

C 与 C++:一对父子的渐行渐远

Posted on 六 17 1月 2026 in Tech • Tagged with C, C++

很多人以为 C++ 就是 "C with Classes",但现代 C++ 早已面目全非。本文带你梳理 C 和 C++ 的核心差异,以及 C++11 到 C++23 的革命性变化——如果你还在写 C++98 风格的代码,是时候升级了。


Continue reading