/sysctl(3) 的进程采集与 curses 库选择机制)
可观测性指标监控【免费下载链接】htophtop - an interactive process viewer项目地址https://gitcode.com/gh_mirrors/ht/htop点击查看免费下载htop 在 NetBSD 上的支持不依赖 procfs而是通过kvm(3)与sysctl(3)接口直接从内核获取进程、CPU、内存等信息。本文以netbsd/README.md为主线结合netbsd/目录下的实际源码讲清楚 NetBSD 平台的进程采集原理、机器信息读取方式、curses 库的编译选项与已知限制帮助你在 NetBSD 上构建和使用 htop 时理解其行为边界。整体技术路线kvm(3) sysctl(3)无需挂载 procfsnetbsd/README.md开宗明义NetBSD 实现利用kvm_getprocs(3)、sysctl(3)等接口从而免去了以 Linux 兼容方式启用mount_procfs(8)这一步。这一实现最初基于 htop 的 OpenBSD 支持演进而来。从源码结构看这一路线贯穿整个netbsd/目录kvm 句柄的建立netbsd/NetBSDMachine.c中Machine_new()调用kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf)netbsd/NetBSDMachine.c只读当前内核状态而不附带核心转储文件。打开失败会直接CRT_fatalError(kvm_openfiles() failed)说明 kvm 是 NetBSD 平台不可缺少的数据来源。构建期依赖检查configure.ac中针对netbsd*平台显式检测两个符号——kvm_openkvm 库与prop_dictionary_getprop 库用于 sysmon/电池等属性读取configure.ac。这两个库的搜索失败都会导致配置直接报错。通用基础设施Makefile.am将generic/下的fdstat_sysctl.c、gettime.c、hostname.c、uname.c与netbsd/下的 4 个平台文件组合为 NetBSD 构建目标Makefile.am说明 NetBSD 与其他 BSD 平台共享了一部分跨平台工具代码。进程表采集kvm_getproc2 与逐进程 sysctlnetbsd/NetBSDProcessTable.c中的ProcessTable_goThroughEntries()是每轮刷新的核心循环批量取进程kvm_getproc2(nhost-kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2), count)一次拿到全部进程的kinfo_proc2结构netbsd/NetBSDProcessTable.c。进程身份与分组PID、PPID、线程组、会话、进程组、TTY 均来自kinfo_proc2的字段是否内核线程由p_flag P_SYSTEM判定。命令行重建NetBSDProcessTable_updateProcessName()用kvm_getargv2(kd, kproc, 500)读取 argv 并拼接成完整命令行取不到时回退为p_comm。源码注释明确指出该回退策略Like NetBSDs top(1)即参考了系统自带 top 的做法。对argv[0]还做了特殊处理例如kdeinit5: Running...这类以冒号结尾的进程名。exe 与 cwdNetBSDProcessTable_updateExe()和NetBSDProcessTable_updateCwd()通过 MIB{ CTL_KERN, KERN_PROC_ARGS, pid, KERN_PROC_PATHNAME / KERN_PROC_CWD }的sysctl()调用逐进程查询netbsd/NetBSDProcessTable.c内核线程会返回空缓冲区此时保持字段为空。CWD 仅在用户启用了 CWD 列PROCESS_FLAG_CWD时才去查询避免不必要的开销。CPU 占用getpcpu()直接移植Borrowed with modifications from NetBSDs top(1)自 NetBSD top100.0 * p_pctcpu / fscale其中fscale在Machine_new()中由{ CTL_KERN, KERN_FSCALE }读取netbsd/NetBSDProcessTable.c。状态判定p_realstat为SACTIVE时进一步调用kvm_getlwps()遍历线程的l_stat把LSONPROC/LSRUN/LSSLEEP/LSSTOP映射为 RUNNING/RUNNABLE/SLEEPING/STOPPEDnetbsd/NetBSDProcessTable.c。进程可显示的列定义在netbsd/NetBSDProcess.c的Process_fields表中覆盖 PID、PPID、PGRP、SESSION、TTY、TPGID、MINFLT/MAJFLT、PRIORITY、NICE、STARTTIME、ELAPSED、PROCESSOR、M_VIRT、M_RESIDENT、ST_UID、PERCENT_CPU、PERCENT_NORM_CPU、PERCENT_MEM、USER、TIME、NLWP、TGID、COMM、EXE、CWD 等平台特有列在netbsd/ProcessField.h中为空PLATFORM_PROCESS_FIELDS仅保留占位注释即 NetBSD 平台目前没有额外的平台私有列。机器信息UVM 内存类、CPU 时间与频率netbsd/README.md虽未逐条列出机器信息但基于 kvm/sysctl的主线在以下实现中得到印证内存NetBSDMachine_scanMemoryInfo()读取{ CTL_VM, VM_UVMEXP2 }把uvmexp中的wired/active/paging/inactive/npages/swpages/swpginuse乘以页大小换算为 KBnetbsd/NetBSDMachine.c。源码注释特意说明在 NetBSD 上把 cache 单列为内存类是错误的——内核 uvmexp 只暴露这几类页面缓存内存无法简单地从某类中扣除。对应地netbsd/Platform.c中Platform_memoryClasses[]恰好定义了 wired、active、paged、inactive 四个类别其中仅 inactive 计为 cachenetbsd/Platform.c。CPU 核数NetBSDMachine_updateCPUcount()先查hw.ncpuonline在线核再查hw.ncpu总核数核数变化时重置 CPU 统计数据Machine_isCPUonline()目前恒返回 true源码中留有Support detecting online / offline CPUs的 TODOnetbsd/NetBSDMachine.c。CPU 时间NetBSDMachine_scanCPUTime()对每个核读取{ CTL_KERN, KERN_CP_TIME, cpuId }得到CP_USER/CP_NICE/CP_SYS/CP_INTR/CP_IDLE等计数再按在线核数求平均netbsd/NetBSDMachine.c。CPU 频率优先按核读取machdep.cpufreq.cpu%u.current适配 ARM big.LITTLE 等按核变频硬件否则依次尝试machdep.est.frequency.current、machdep.cpu.frequency.current等一组遗留 sysctl 节点machdep.tsc_freq需要除以 1000000 换算为 MHznetbsd/NetBSDMachine.c。负载与电池Platform_getLoadAverage()读{ CTL_VM, VM_LOADAVG }并除以fscalePlatform_getBattery()打开_PATH_SYSMON用 proplib 解析device-class为battery/ac-adapter的属性累加cur-value/max-value计算电量百分比netbsd/Platform.c。为兼容 NetBSD 9.x 稳定分支Platform.c还为 9.99.65 之前的旧 proplib API 做了prop_string_equals_cstring、prop_number_integer_value两个别名定义netbsd/Platform.c。默认界面NetBSD 平台的默认 Screen 为PID USER PRIORITY NICE M_VIRT M_RESIDENT STATE PERCENT_CPU PERCENT_MEM TIME Command默认按 PERCENT_CPU 排序netbsd/Platform.c。NetBSD curses 注意事项为什么默认用 ncursesnetbsd/README.md中篇幅最重的部分是 Notes on NetBSD curses这是 NetBSD 构建者最常踩到的问题要点如下双 curses 环境NetBSD 是少数仍自行维护 Curses 实现的操作系统之一。htop 既可以编译为链接 ncurses也可以链接 NetBSD 自带的curses(3)。默认偏好 ncursesconfigure 的默认搜索顺序中 ncurses 系在前、curses 在最后。从源码看configure.ac里curses_pkg_namesncurses6 ncurses5 ncurses ncursest6 ncursest5 ncursest cursesUnicode 启用时还会在最前面插入ncursesw6 ncursesw5 ncursesw ncursestw*configure.ac。因此只要系统安装了 ncursesconfigure 就会优先选中它——README 中htop 支持 NetBSD curses 的能力有限正是这一默认策略的原因。使用 NetBSD libcurses 的方法在较早版本中必须配置--disable-unicode自 htop 3.4.0 起新增--with-cursescurses选项即使两个库同时安装也能让 configure 跳过 ncurses 直接选用 curses。configure.ac中--with-cursesNAME会覆盖默认包名列表configure.ac并支持CURSES_CFLAGS/CURSES_LIBS两个环境变量整体覆盖自动探测结果适合手工指定头文件与链接标志。两条技术限制README 原文列出Unicode 模式直接访问cchar_t结构体htop 开启 Unicode 后直接读写 ncurses 的cchar_t内部字段而 NetBSD curses 的cchar_t布局不同因此 Unicode 构建无法链接 NetBSD libcurses鼠标支持缺失NetBSD 9 及更早版本的 libcurses 没有任何鼠标支持鼠标 API 本就是 ncurses 扩展更新的版本只提供了空操作的鼠标函数以保持与 ncurses 的接口兼容——也就是说调用不会报错但实际拿不到鼠标事件。已知不足与待改进项What needs improvementREADME 明确列出了四项未完成工作这些在源码中同样可以找到对应痕迹内核线程与用户态线程不被显示/计数README 建议参考 NetBSD top(1)。源码侧ProcessTable_goThroughEntries()会统计kernelThreads/userlandThreads计数netbsd/NetBSDProcessTable.c但 NetBSD 平台未实现按线程展开显示kvm_getlwps()目前仅用于推断进程状态。libcurses 的 Unicode 支持对应上文cchar_t布局差异的限制。fstat(1) 支持类似 Linux 的 lsof(8)查看进程打开的文件当前Platform_getProcessLocks()直接返回 NULLnetbsd/Platform.c打开文件列表相关能力尚未实现。ktrace(1) 支持类似 Linux 的 strace(1)尚无对应实现。小结htop 的 NetBSD 支持把读内核这件事完全交给了 kvm(3) 与 sysctl(3)进程表来自kvm_getproc2加逐进程KERN_PROC_ARGS查询CPU/内存/负载来自kern.cp_time、vm.uvmexp2、vm.loadavg等标准 MIB构建层面则要求 kvm 与 prop 两个库。使用上的主要约束集中在 curses 选型想要最完整的功能Unicode 渲染请使用 ncurses坚持使用系统自带的 libcurses 时需--disable-unicode3.4.0 可改用--with-cursescurses并接受鼠标不可用的现实。文档中列出的线程显示、fstat(1)、ktrace(1) 等仍是明确的待办项阅读netbsd/源码时可按图索骥。赞分享可观测性指标监控【免费下载链接】htophtop - an interactive process viewer项目地址https://gitcode.com/gh_mirrors/ht/htop点击查看免费下载相关推荐NixOS 内核定制完全指南从 kernelPackages 选择到模块、sysctl 与 Rust 支持NixOS 内核定制完全指南从 kernelPackages 选择到模块、sysctl 与 Rust 支持 本篇技术指南以 NixOS 手册 Linux Ke包管理器操作系统GetQzonehistory 快速实战指南把几年的历史说说一键导出成 ExcelGetQzonehistory 快速实战指南把几年的历史说说一键导出成 Excel 跑完一次你会得到一个以自己 QQ 号命名的文件夹7 张 Excel 清网页爬虫数据分析最实用的Android选择器库3分钟实现时间与省市区联动选择最实用的Android选择器库3分钟实现时间与省市区联动选择 你还在为Android应用中的日期选择、地址选择功能编写大量重复代码吗还在解决滚轮选择器的联动移动开发UI组件上一篇Data-Science-For-Beginners 数据科学沟通课用数据讲故事的五项策略与实战案例下一篇shadcn-vue Tooltip 组件完全指南安装、源码解析与自定义实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考