Skip to content

Commit 1206b44

Browse files
phase 4 is finished
1 parent ceb24c1 commit 1206b44

37 files changed

Lines changed: 2470 additions & 17 deletions

CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,15 @@ if(CFBOX_ENABLE_INIT)
4242
file(GLOB_RECURSE INIT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/applets/init/*.cpp)
4343
list(APPEND CFBOX_APPLET_SOURCES ${INIT_SOURCES})
4444
endif()
45+
if(CFBOX_ENABLE_TOP)
46+
file(GLOB_RECURSE TOP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/applets/top/*.cpp)
47+
list(APPEND CFBOX_APPLET_SOURCES ${TOP_SOURCES})
48+
endif()
4549

4650
# Single-file applets
4751
foreach(applet IN LISTS CFBOX_APPLETS)
4852
string(TOUPPER "${applet}" APPLET_UPPER)
49-
if(NOT applet STREQUAL "sh" AND NOT applet STREQUAL "awk" AND NOT applet STREQUAL "init" AND CFBOX_ENABLE_${APPLET_UPPER})
53+
if(NOT applet STREQUAL "sh" AND NOT applet STREQUAL "awk" AND NOT applet STREQUAL "init" AND NOT applet STREQUAL "top" AND CFBOX_ENABLE_${APPLET_UPPER})
5054
list(APPEND CFBOX_APPLET_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/applets/${applet}.cpp)
5155
endif()
5256
endforeach()

Roadmap.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ CFBox 是一个 C++23 BusyBox 替代品,当前版本有 78 个 applet。项目
1818
| 1 | POSIX Shell + Coreutils I ✅ | ~17 | Shell 引擎、进程管理、信号处理 | ~34 |
1919
| 2 | Coreutils II + findutils ✅ | ~44 | 流处理管线、校验和框架 | ~78 |
2020
| 3 | 归档 + 压缩 + 文本处理 ✅ | ~15 | 终端抽象、压缩框架 | ~93 |
21-
| 4 | 进程/Init + util-linux 🔧 | ~8/38 | /proc 解析器、init 系统 | ~100 |
21+
| 4 | 进程/Init + util-linux 🔧 | ~21/38 | /proc 解析器、init 系统、TUI 框架 | ~114 |
2222
| 5 | vi 可视化编辑器 | 1 | TUI 框架、屏幕渲染、键盘映射 | ~133 |
2323
| 6 | 网络 + 登录 + 日志 | ~35 | Socket 抽象、HTTP 解析、shadow 密码 | ~168 |
2424
| 7 | 剩余组件 + 集成验证 | ~40+ | POSIX 验证、容器替换测试 | ~200+ |
2525

26-
**当前状态**:Phase 0-3 已完成,Phase 4 进行中。100 个 applet,288 单元测试全部通过。CFBox 已可在 QEMU 中作为 PID 1 运行完整 init 系统。
26+
**当前状态**:Phase 0-3 已完成,Phase 4 进行中。114 个 applet,318 单元测试全部通过。CFBox 已可在 QEMU 中作为 PID 1 运行完整 init 系统。TUI 框架已就绪,为 Phase 5 vi 编辑器奠定基础
2727

2828
---
2929

@@ -160,7 +160,7 @@ Shell 已实现为第一个多文件 applet(`src/applets/sh/`,8 个模块,
160160

161161
### 基础设施 ✅
162162
- **`/proc` 解析器** `include/cfbox/proc.hpp` ✅:集中解析 /proc/meminfo, /proc/stat, /proc/[pid]/stat, /proc/[pid]/cmdline, /proc/[pid]/status, /proc/loadavg, /proc/uptime, /proc/mounts, /proc/diskstats, /proc/partitions
163-
- **TUI 框架** `include/cfbox/tui.hpp`:全屏终端应用抽象(top、后续的 vi/less 共用)— 待实现
163+
- **TUI 框架** `include/cfbox/tui.hpp`:全屏终端应用抽象(ScreenBuffer、Key 解析、TuiApp 虚基类、SIGWINCH 处理),top 和后续 vi/less 共用
164164

165165
### Init 系统 ✅
166166
- **inittab 解析器** ✅:解析 `/etc/inittab`,支持运行级别、respawn、once 条目
@@ -170,21 +170,27 @@ Shell 已实现为第一个多文件 applet(`src/applets/sh/`,8 个模块,
170170
- **QEMU 兼容** ✅:无 inittab 时自动回退 smoke test 模式,保持 CI 兼容
171171
- **getty 集成**:在 TTY 上生成登录提示 — 待 Phase 6
172172

173-
### procps(已完成 8/16)
174-
`ps` ✅, `kill` ✅, `free` ✅, `uptime` ✅, `pgrep`/`pkill` ✅, `pidof` ✅, `sysctl`
173+
### procps(已完成 15/16)
174+
`ps` ✅, `kill` ✅, `free` ✅, `uptime` ✅, `pgrep`/`pkill` ✅, `pidof` ✅, `sysctl`, `pwdx` ✅, `pstree` ✅, `pmap` ✅, `fuser` ✅, `iostat` ✅, `watch` ✅, `top`
175175

176-
`top`, `pmap`, `iostat`, `lsof`, `watch`, `pstree`, `fuser`, `pwdx` — 待实现
176+
`lsof` — 待实现
177177

178-
### util-linux(待实现
179-
**存储/块设备**`mount`/`umount`, `blkid`, `blockdev`, `dmesg`, `fdisk`, `mkfs`, `fsck`, `losetup`, `pivot_root`, `switch_root`, `swapon`/`swapoff`
178+
### util-linux(已完成 6/30
179+
`dmesg`, `hexdump`, `more`, `rev`, `cal`, `renice`
180180

181-
**系统工具**`hexdump`, `more`, `flock`, `getopt`, `cal`, `rev`, `setsid`, `nsenter`, `unshare`, `mdev`, `lspci`, `lsusb`, `hwclock`, `rtcwake`, `taskset`, `chrt`, `ionice`, `renice`, `last`, `mesg`, `wall`, `script`
181+
**存储/块设备**(待实现):`mount`/`umount`, `blkid`, `blockdev`, `fdisk`, `mkfs`, `fsck`, `losetup`, `pivot_root`, `switch_root`, `swapon`/`swapoff`
182+
183+
**系统工具**(待实现):`flock`, `getopt`, `setsid`, `nsenter`, `unshare`, `mdev`, `lspci`, `lsusb`, `hwclock`, `rtcwake`, `taskset`, `chrt`, `ionice`, `last`, `mesg`, `wall`, `script`
182184

183185
### 验证 ✅(已通过)
184186
- CFBox 作为 PID 1 在 QEMU aarch64 中启动,运行 inittab,执行 sysinit 命令,spawn shell(respawn),处理关机 ✅
185187
- `ps aux` 输出与 procps 格式匹配 ✅
186188
- `free -h``uptime``kill -l``pidof``sysctl` 在 QEMU 中正常工作 ✅
187189
- 288 单元测试全部通过 ✅
190+
- `top -b -n 1` 在批处理模式下输出进程表 ✅
191+
- `pstree -p` 显示进程树和 PID ✅
192+
- `hexdump -C /dev/null``cal``rev` 功能正确 ✅
193+
- 318 单元测试全部通过 ✅
188194
- 容器测试:CFBox 替换 Alpine 容器中的 BusyBox — 待实现
189195

190196
---
@@ -206,7 +212,7 @@ Shell 已实现为第一个多文件 applet(`src/applets/sh/`,8 个模块,
206212
- **滚动**:半页/整页滚动(Ctrl-D/Ctrl-U/Ctrl-F/Ctrl-B),长行折行显示
207213

208214
### 基础设施
209-
- TUI 框架已在 Phase 4 实现,vi 直接复用
215+
- TUI 框架已在 Phase 4 实现,vi 直接复用
210216
- 屏幕缓冲区管理、增量渲染
211217
- 键盘事件映射(普通键 + 转义序列解析)
212218
- 信号处理(SIGWINCH 终端大小变化)

cmake/Config.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ set(CFBOX_APPLETS
2424
gzip gunzip diff cmp patch ed tar cpio ar unzip
2525
awk
2626
free uptime kill pidof ps pgrep sysctl
27+
pwdx pstree pmap fuser iostat
28+
watch top
29+
dmesg hexdump more rev cal renice
2730
)
2831

2932
foreach(applet IN LISTS CFBOX_APPLETS)

include/cfbox/applet_config.hpp.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,16 @@
100100
#cmakedefine01 CFBOX_ENABLE_PS
101101
#cmakedefine01 CFBOX_ENABLE_PGREP
102102
#cmakedefine01 CFBOX_ENABLE_SYSCTL
103+
#cmakedefine01 CFBOX_ENABLE_PWDX
104+
#cmakedefine01 CFBOX_ENABLE_PSTREE
105+
#cmakedefine01 CFBOX_ENABLE_PMAP
106+
#cmakedefine01 CFBOX_ENABLE_FUSER
107+
#cmakedefine01 CFBOX_ENABLE_IOSTAT
108+
#cmakedefine01 CFBOX_ENABLE_WATCH
109+
#cmakedefine01 CFBOX_ENABLE_TOP
110+
#cmakedefine01 CFBOX_ENABLE_DMESG
111+
#cmakedefine01 CFBOX_ENABLE_HEXDUMP
112+
#cmakedefine01 CFBOX_ENABLE_MORE
113+
#cmakedefine01 CFBOX_ENABLE_REV
114+
#cmakedefine01 CFBOX_ENABLE_CAL
115+
#cmakedefine01 CFBOX_ENABLE_RENICE

include/cfbox/applets.hpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,45 @@ extern auto pgrep_main(int argc, char* argv[]) -> int;
292292
#if CFBOX_ENABLE_SYSCTL
293293
extern auto sysctl_main(int argc, char* argv[]) -> int;
294294
#endif
295+
#if CFBOX_ENABLE_PWDX
296+
extern auto pwdx_main(int argc, char* argv[]) -> int;
297+
#endif
298+
#if CFBOX_ENABLE_PSTREE
299+
extern auto pstree_main(int argc, char* argv[]) -> int;
300+
#endif
301+
#if CFBOX_ENABLE_PMAP
302+
extern auto pmap_main(int argc, char* argv[]) -> int;
303+
#endif
304+
#if CFBOX_ENABLE_FUSER
305+
extern auto fuser_main(int argc, char* argv[]) -> int;
306+
#endif
307+
#if CFBOX_ENABLE_IOSTAT
308+
extern auto iostat_main(int argc, char* argv[]) -> int;
309+
#endif
310+
#if CFBOX_ENABLE_WATCH
311+
extern auto watch_main(int argc, char* argv[]) -> int;
312+
#endif
313+
#if CFBOX_ENABLE_TOP
314+
extern auto top_main(int argc, char* argv[]) -> int;
315+
#endif
316+
#if CFBOX_ENABLE_DMESG
317+
extern auto dmesg_main(int argc, char* argv[]) -> int;
318+
#endif
319+
#if CFBOX_ENABLE_HEXDUMP
320+
extern auto hexdump_main(int argc, char* argv[]) -> int;
321+
#endif
322+
#if CFBOX_ENABLE_MORE
323+
extern auto more_main(int argc, char* argv[]) -> int;
324+
#endif
325+
#if CFBOX_ENABLE_REV
326+
extern auto rev_main(int argc, char* argv[]) -> int;
327+
#endif
328+
#if CFBOX_ENABLE_CAL
329+
extern auto cal_main(int argc, char* argv[]) -> int;
330+
#endif
331+
#if CFBOX_ENABLE_RENICE
332+
extern auto renice_main(int argc, char* argv[]) -> int;
333+
#endif
295334

296335
// registry — one line per applet, conditionally compiled
297336
constexpr auto APPLET_REGISTRY = std::to_array<cfbox::applet::AppEntry>({
@@ -585,4 +624,43 @@ constexpr auto APPLET_REGISTRY = std::to_array<cfbox::applet::AppEntry>({
585624
#if CFBOX_ENABLE_SYSCTL
586625
{"sysctl", sysctl_main, "configure kernel parameters at runtime"},
587626
#endif
627+
#if CFBOX_ENABLE_PWDX
628+
{"pwdx", pwdx_main, "print working directory of a process"},
629+
#endif
630+
#if CFBOX_ENABLE_PSTREE
631+
{"pstree", pstree_main, "display a tree of processes"},
632+
#endif
633+
#if CFBOX_ENABLE_PMAP
634+
{"pmap", pmap_main, "display memory map of a process"},
635+
#endif
636+
#if CFBOX_ENABLE_FUSER
637+
{"fuser", fuser_main, "identify processes using files or sockets"},
638+
#endif
639+
#if CFBOX_ENABLE_IOSTAT
640+
{"iostat", iostat_main, "report CPU and I/O statistics"},
641+
#endif
642+
#if CFBOX_ENABLE_WATCH
643+
{"watch", watch_main, "execute a program periodically"},
644+
#endif
645+
#if CFBOX_ENABLE_TOP
646+
{"top", top_main, "display Linux processes"},
647+
#endif
648+
#if CFBOX_ENABLE_DMESG
649+
{"dmesg", dmesg_main, "print kernel ring buffer"},
650+
#endif
651+
#if CFBOX_ENABLE_HEXDUMP
652+
{"hexdump", hexdump_main, "display file contents in hexadecimal"},
653+
#endif
654+
#if CFBOX_ENABLE_MORE
655+
{"more", more_main, "file perusal filter for crt viewing"},
656+
#endif
657+
#if CFBOX_ENABLE_REV
658+
{"rev", rev_main, "reverse lines characterwise"},
659+
#endif
660+
#if CFBOX_ENABLE_CAL
661+
{"cal", cal_main, "display a calendar"},
662+
#endif
663+
#if CFBOX_ENABLE_RENICE
664+
{"renice", renice_main, "alter priority of running processes"},
665+
#endif
588666
});

0 commit comments

Comments
 (0)