可观测性指标监控【免费下载链接】htophtop - an interactive process viewer项目地址https://gitcode.com/gh_mirrors/ht/htop点击查看免费下载htop 仓库根目录下的 AGENTS.md 是一份专为 AI 编码代理coding agent编写的工程指引浓缩了构建 htop 的命令、源自 docs/styleguide.md 的代码风格约定、以虚函数表vtable实现的面向对象 C 架构以及仓库的 AI 贡献披露政策。阅读本文后你将掌握 htop 的完整构建流程与关键 configure 开关、可直接套用的 C 编码规范、从入口 htop.c 到主循环 ScreenManager.c 的调用链原理以及提交 AI 辅助代码时Assisted-by:与Signed-off-by:提交尾注trailer的正确用法。一、构建 htopautogen、configure 与关键开关AGENTS.md 给出的标准构建路径分三档# 为本机构建 htop 二进制 ./autogen.sh ./configure make # 启用 Performance Co-PilotPCP支持构建 pcp-htop 二进制 ./autogen.sh ./configure --enable-pcp make # 代码修改后的增量重建无需再次运行 autogen makeautogen.sh的作用是由autoconf体系重新生成configure脚本只有在修改了 configure.ac 或 Makefile.am 之后才需要重新执行日常开发中修改 C 源码后直接make即可。仓库同时提供htop.c本地系统后端与pcp-htop.cPCP 后端两个程序入口这与 AGENTS.md 中“文件名命名唯一例外是htop.c和pcp-htop.c”的规则相呼应。关键 configure 开关AGENTS.md 列出的六个开关均可在 configure.ac 中找到对应的AC_ARG_ENABLE定义其行为如下开关默认值作用--enable-pcp关闭enable_pcpno启用 PCP PMAPI 支持构建pcp-htop二进制--enable-capabilities自动探测check链接 Linux libcapcap_init与sys/capability.h用于提升进程权限等操作--enable-delayacct自动探测check启用 Linux delay accounting提供进程调度延迟数据--enable-sensors自动探测check链接 lm-sensorssensors_init与sensors/sensors.h读取硬件传感器数据--enable-unicode开启enable_unicodeyes允许使用 Unicode 界面字符依赖终端/ncurses 能力--enable-debug关闭enable_debugno生成调试构建从 configure.ac 的结构看多数开关支持yes/no/check三态取值非法取值会直接触发AC_MSG_ERROR报错退出configure结束时会打印一份配置摘要delay accounting、sensors、capabilities、unicode、debug 等方便确认本次构建能力。PCP 是可选后端关闭时构建出读取本机内核数据的htop启用后pcp-htop通过 PMAPI 拉取指标能力取决于 PCP 环境。二、代码风格规范3 空格缩进、CamelCase 与包含顺序AGENTS.md 的“Code Style”一节是 docs/styleguide.md 的浓缩版贡献者包括 AI 代理必须遵守以下约定。命名约定缩进3 个空格永远不使用 Tab文件名CamelCase如Process.c、CPUMeter.h目录一律小写linux/、zfs/唯一例外是入口文件htop.c与pcp-htop.c函数名模块名_函数名()前缀通常与模块名一致例如Process_compare()XUtils.h的内存与字符串工具函数是前缀规则的例外变量名短而精确——循环计数器用i而非someCounterValueForThisSimpleLoop模块私有全局变量必须声明为static只有极少数确需跨模块共享的变量才在头文件中extern声明。文件内容结构与头文件守卫源文件的组织遵循一套松散模板版权声明 → 头文件包含 → 数据结构与前向声明 →static私有函数实现 → 对外可见函数实现 → 对外可见的常量结构伪面向对象定义。头文件的 include guard 有一个历史惯例#ifndef/#define守卫位于版权注释之前例如 docs/styleguide.md 给出的示例#ifndef HEADER_FILENAME #define HEADER_FILENAME /* htop - Filename.h (C) 2021 htop dev team Released under the GNU GPLv2, see the COPYING file in the source distribution for its full text. */头文件包含顺序五组组间空行分隔#include config.h // IWYU pragma: keep—— 当模块需要 automake/autoconf 的全局配置或 C 库特性宏如__GNU_SOURCE时必选本模块配套头文件仅.c文件头文件中省略系统头文件非条件包含程序头文件条件包含的头文件系统头在前。每组内部按字母序排序且子目录路径排在父级文件之后因此unistd.h排在sys/time.h之前。一个容易踩坑的规则只要.c文件使用XUtils.h无论是自身还是被包含的头文件间接使用就必须在该.c文件顶部按上述方式包含config.h。XUtils.h内部设有完整性检查缺失会直接导致编译错误或者引发更难排查的编译问题config.h的包含只出现在.c文件中绝不放入头文件。内存、字符串与控制流内存分配一律使用xMalloc()、xCalloc()、xRealloc()失败即退出数组场景用xReallocArray()/xReallocArrayZero()分配 0 字节是错误应显式使用NULL并相应处理字符串优先使用XUtils.h中String_*系列函数如String_eq()、String_cat()替代裸strcmp/strcat例如!strcmp(foo, foo)应写作String_eq(foo, foo)导出控制非公共 API 的函数一律标记static公共 API 必须在配套头文件中有声明避免函数式宏参数重求值、语法逃逸、弱类型都是其缺点大括号简单单语句return、break、continue、goto、平凡赋值可省略大括号控制流主体严禁与条件写在同一行同一 if/else 链中只要一个分支用了大括号所有分支都必须使用。换行与空行超长表达式的续行比首行再多一级缩进if (very_long_condition another_very_complex_expression something_else_to_check) { // Code follows as normal ... } else { }函数内用单个空行分隔相关语句组帮助梳理方法流程。styleguide 还给出了一条 astyle 基线命令可作为自动格式化起点astyle -r -xb -s3 -p -xg -c -k1 -W1 -H \*.c \*.h系统 API 的兼容性要求代码必须能在任意 C99 编译器上编译。使用新平台特性如 Linux 的fstatat时应提供 POSIX 回退方案例如用fstat模拟无法提供回退时应当优雅降级并在界面上向用户明确提示该功能不可用。htop 的generic/目录如 generic/Compat.c 所在的平台无关工具集正是承载这类跨平台兜底代码的位置。三、架构以虚函数表实现的面向对象 CAGENTS.md 指出 htop 是 C99 编写的跨平台交互式进程查看器核心设计是“面向对象 C 模式 虚函数表”。这一说法可以直接在 Object.h 中得到印证typedef void(*Object_Display)(const Object*, RichString*); typedef int(*Object_Compare)(const void*, const void*); typedef void(*Object_Delete)(Object*); typedef struct ObjectClass_ { const void* const extends; const Object_Display display; const Object_Delete delete; const Object_Compare compare; } ObjectClass; struct Object_ { const ObjectClass* klass; };每个对象内部持有一个klass指针指向ObjectClass即虚函数表display、delete、compare三个函数指针构成“虚方法”。头文件还提供了便捷的宏封装Object_getClass()、Object_delete()、Object_display()、Object_compare()通过断言保证函数指针非空后再调用AllocThis(class_)宏则是伪对象创建的惯用法——分配内存并立刻Object_setClass(this, Class(class_))其中Class(class_)展开为Class_ ## _class这样的类描述符常量。Object_isA()则基于extends字段实现“is-a”类型判断相当于 C 版的类型继承链查询。类层次AGENTS.md 描述的三条继承链对应仓库中的具体文件Object→Row→Process每行表格数据的基类链进程数据在 Process.c、Row.c 中实现Object→Panel带事件处理与滚动能力的 UI 部件见 Panel.cObject→Meter支持文本/条形/图形三种显示模式的系统指标见 Meter.c。平台抽象层每个平台目录提供四件套由Machine基类统一调度平台目录提供的文件linux/、darwin/、freebsd/、netbsd/、openbsd/、dragonflybsd/、solaris/、pcp/、unsupported/Platform.c/.h—— 平台初始化/收尾、load average、时钟等同上PlatformMachine.c/.h—— 系统状态CPU 数量、内存、运行时长同上PlatformProcessTable.c/.h—— 从操作系统枚举进程同上PlatformProcess.c/.h—— 平台特有的进程字段以 Linux 为例linux/LinuxMachine.c、linux/LinuxProcessTable.c、linux/LinuxProcess.c 与 linux/Platform.c 共同构成 Linux 后端linux/ProcessField.h 则定义该平台可用的进程列字段。unsupported/目录为未适配平台提供空实现兜底保证编译链完整。pcp/平台比较特殊它通过 PCP 的 PMAPI 获取指标并支持用配置文件动态定义列、Meter 与屏幕——pcp/columns/如tcp、gpu_memory、pcp/meters/如entropy、mysql、pcp/screens/如biosnoop、opensnoop中的每个文件都是一个可被 PCPDynamicColumn.c、PCPDynamicMeter.c、PCPDynamicScreen.c 加载解析的定义。主循环从源码结构看调用链为htop.c或pcp-htop.c→CommandLine_run()→ScreenManager_run()。htop.c 的main函数只有两行核心逻辑int main(int argc, char** argv) { return CommandLine_run(argc, argv); }ScreenManager.c 中的ScreenManager_run()L241 起是主循环所在其骨架如下计时重算checkRecalculation()基于时间阈值触发重新采集——拉取进程数据、刷新 Meter按需重绘当redraw或force_redraw为真时调用ScreenManager_drawPanels()并支持iterationsRemaining控制有限刷新次数后退出读取键盘输入Panel_getCh(panelFocus)获取按键或鼠标事件经FunctionBar_synthesizeEvent()合成为功能键事件分发动作处理器按键交给 Action 层返回Htop_Reaction标志位REFRESH、RECALCULATE、QUIT 等。Htop_Reaction是位标志枚举定义在 Action.htypedef enum { HTOP_OK 0x00, HTOP_REFRESH 0x01, HTOP_RECALCULATE 0x02 | HTOP_REFRESH, HTOP_SAVE_SETTINGS 0x04, HTOP_KEEP_FOLLOWING 0x08, HTOP_QUIT 0x10, HTOP_REDRAW_BAR 0x20, HTOP_UPDATE_PANELHDR 0x40 | HTOP_REFRESH, HTOP_RESIZE 0x80 | HTOP_REFRESH | HTOP_REDRAW_BAR | HTOP_UPDATE_PANELHDR, } Htop_Reaction;所有键盘动作函数都遵循统一签名Htop_Reaction (*Htop_Action)(State* st)见 Action.h其中State结构聚合了Machine*、主面板、Header 与各种开关状态。这种“动作返回位标志、主循环集中响应”的设计使按键处理与界面刷新解耦。核心子系统一览文件职责Action.c键盘动作处理器每个返回Htop_ReactionSettings.c配置持久化~/.config/htop/htoprcHeader.c顶部区域的 Meter 布局FunctionBar.c底部 F1–F10 功能键标签CRT.cncurses 抽象层颜色、属性、输入Vector.c / Hashtable.c通用容器XUtils.c内存包装器与字符串工具使用它的.c必须包含config.hRichString.c带属性/颜色的字符串缓冲区generic/可跨多个平台共享的例程如 generic/uname.c、generic/gettime.c四、AI 贡献政策Assisted-by 与 Signed-off-by 的分工AGENTS.md 最后定义了仓库对 AI 辅助贡献的规则完整版见 docs/ai-contributions-policy.mdv1.02026-02-18其要点可归纳为四条允许使用贡献者 MAY 使用 AI 辅助开发但必须遵守政策责任Accountability贡献者 MUST 为自己的贡献承担全部责任——无论代码来自人类还是 LLM都代表对质量、许可证合规与实用性的背书贡献者永远是作者对贡献整体完全负责透明Transparency当贡献的显著部分未经修改地取自 AI 工具时MUST 披露 AI 使用其他有益场景 SHOULD 披露。例行使用工具纠正语法拼写、润色语言则无需披露。git 场景下的推荐做法是Assisted-by:提交尾注例如Assisted-by: generic LLM chatbot Assisted-by: ChatGPTv5非 git 场景文档前言、设计文件元数据、issue 留言也可用Assisted-by:行披露评审评估AI 可辅助人类评审者做分析与建议但 MUST NOT 作为实质性或主观判断的唯一/最终仲裁者CI/CD、自动化测试、垃圾过滤等客观技术校验不受此限。接受的最终责任始终落在授权该操作的人类贡献者身上。AGENTS.md 在此基础上补充了两条操作细节提交应使用Signed-off-by:尾注git commit -s认证开发者原创证书Developer Certificate of Origin的承诺签名与披露是两回事Assisted-by:记录的是“用了什么工具”Signed-off-by:记录的是“人类为内容负责”AI 代理不得未经贡献者确认就代替其签署Signed-off-by:。这一套规则对 AI 编码代理的落地含义很明确你可以修改代码、生成补丁但必须如实留下Assisted-by:尾注且把Signed-off-by:的签署决定权留给人。五、小结这份 AGENTS.md 如何指导一次典型贡献把全文串起来AI 代理或人类贡献者在 htop 仓库完成一次改动的标准流程是用./autogen.sh ./configure make搭好构建按需追加--enable-pcp、--enable-sensors等开关改动时遵守 3 空格缩进、CamelCase 文件与函数命名、五组包含顺序、static导出控制和xMalloc/String_*工具集涉及平台行为时按平台四件套Platform、Machine、ProcessTable、Process定位涉及交互时理解ScreenManager_run主循环与Htop_Reaction标志机制提交时以Signed-off-by:署名并在实质使用 AI 时追加Assisted-by:尾注。AGENTS.md 的价值正在于把这些分散在 docs/styleguide.md、docs/ai-contributions-policy.md 与源码结构中的约定压缩成一份可被机器直接执行的工程契约。赞分享可观测性指标监控【免费下载链接】htophtop - an interactive process viewer项目地址https://gitcode.com/gh_mirrors/ht/htop点击查看免费下载相关推荐华为CANN算子库Pad接口Pad 产品支持情况 ! npu950 id1 term Ascend 950PR/Ascend 950DT/term 不支持 ! end id深度学习人工智能机器学习分布式训练Vim 仓库开发协作指南面向 AI Coding Agent 与贡献者的贡献规范、构建测试与代码风格全解析Vim 仓库开发协作指南面向 AI Coding Agent 与贡献者的贡献规范、构建测试与代码风格全解析 本文以 Vim 官方仓库根目录的 AGENTS.m开发工具代码编辑器Larastarters 插件开发指南如何为 Laravel 项目添加自定义功能模块Larastarters 插件开发指南如何为 Laravel 项目添加自定义功能模块 Larastarters 是一款强大的 Laravel 项目启动工具它上一篇2025年最强漫画下载神器一键解决8大下载痛点下一篇formSelects终极指南Layui生态下的高效多选解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
