Appearance
👋 你好,我是 Felix Qiu
C++ / Linux 后端开发工程师
用现代 C++ 构建可运行、可验证的并发与系统服务。
👋 很高兴认识你
我是一名专注于 C++ 与 Linux 后端开发的工程师。相比只实现功能,我更喜欢把并发、进程管理和网络 I/O 中的抽象概念,做成能够运行、测试和持续改进的系统。
我特别关注程序在边界情况下的表现:队列满载时如何取舍、任务异常如何传递、子进程如何回收、服务关闭后资源是否仍然可控。这些问题也是我持续学习系统编程的动力。
🧭 我正在做什么
- 构建和完善 Linux 本地任务执行服务
runnerd - 深入学习 C++ 并发、资源管理与性能分析
- 练习 Linux 网络编程、事件驱动 I/O 与服务端设计
- 把学习所得沉淀为有测试、有文档的工程项目
🚀 项目作品
🖥️ runnerd:事件驱动的 Linux 任务执行守护进程
面向单机、单用户场景的本地任务执行服务。客户端 runnerctl 通过 Unix Domain Socket 提交和查询任务,runnerd 负责启动、监控与回收子进程。
- 用一个 LT
epoll事件循环统一处理客户端连接、子进程标准流与SIGCHLD;以signalfd + waitpid驱动任务生命周期 - 设计长度前缀协议和增量解码器,处理 Stream Socket 的拆包、粘包及二进制负载;通过非阻塞管道采集输出
- 使用
fork/execve与独立进程组执行任务,不经过 Shell;实现QUEUED → RUNNING → SUCCEEDED / FAILED状态机与命令行查询 - 使用 GoogleTest、CTest 和 GitHub Actions 覆盖协议、状态转移、进程监管和端到端流程
C++17 Linux epoll Unix Domain Socket fork/execve signalfd
当前边界:
runnerd是面向可信单用户 Linux 环境的实验性项目;暂不包含认证、沙箱隔离、持久化、任务取消和真正生效的执行超时机制。
📝 cpp_logger:异步日志库
一个面向本地应用的 C++17 异步日志库:业务线程快速提交日志,后台线程完成批量格式化、写入和文件滚动。
- 使用有界阻塞队列解耦业务线程与文件 I/O,并提供
Block、DropNewest、DropOldest三种过载策略 - 支持五级日志过滤、毫秒时间戳、线程 ID、源位置以及按日期或文件大小滚动
- 通过批量写入降低 I/O 开销,并提供队列长度、峰值和丢弃量等可观测指标
- 支持
FileSink、ConsoleSink与自定义LogSink;提供 CMake 包、测试、CI 和 Sanitizer 检查
C++17 多线程 条件变量 异步 I/O CMake CTest ASan TSan
🧵 cpp_thread_pool:轻量级线程池
一个基于 C++17 标准库实现的线程池,覆盖任务提交、调度、执行、结果返回与优雅关闭的完整并发链路。
- 支持固定线程与 Cached 动态扩容两种模式,额外线程可在空闲后自动回收
- 使用
std::packaged_task和std::future<T>返回结果,并将任务异常传递至future.get() - 通过有界队列限制任务积压;队列满时按配置等待,超时后拒绝提交
- 实现可重入的
shutdown()与关闭后重启,并覆盖并发关闭、重复启动和队列满载等边界场景
C++17 线程池 std::future 条件变量 泛型编程 CMake
💡 我关心的工程问题
- 清晰的资源所有权、生命周期和错误处理路径
- 可观测的系统状态,以及发生过载或失败时明确的行为
- 用测试、持续集成和工具链把实现交付为可维护的工程
🛠️ 技术栈
| C++ 与并发 | Linux 系统编程 | 工程实践 |
|---|---|---|
| C++17、RAII、模板、泛型编程 | epoll、非阻塞 I/O、Unix Domain Socket | CMake、CTest、GoogleTest、GitHub Actions |
std::thread、互斥锁、条件变量、原子操作 | fork、execve、管道、进程组、waitpid、signalfd | clang-format、clang-tidy、ASan、TSan |
线程池、任务队列、异步日志、std::future | 长度前缀协议、增量解码、子进程输出采集 | VitePress、Nginx、HTTPS、Linux 服务器部署 |
📫 联系我
- GitHub: qxf-72
- 个人网站: xiaofeng-qiu.me
- 邮箱: xiaofeng_qiu@qq.com