Releases: ViudiraTech/PySpOS
Releases · ViudiraTech/PySpOS
Release list
v3.2.0 — 真子进程、OOBE 向导、终端输入自愈
进程与调度
- apps 从协作式模拟升级为真子进程 fork/exec(
src/forkexec.py) - PID 0 swapper / 1 init / 2 shell 三级引导,孤儿收养与僵尸回收
- 后台作业:
cmd &、jobs/fg/bg/wait、进程组与会话 - apps 通过 syscall RPC 请求特权操作,不再直接触碰父进程内存
引导与终端
- OOBE 11 步 curses 首次开机向导,真实时区(
zoneinfo+TZ)与语言 - TUI 按显示宽度布局(CJK 双宽),内容定宽再折行
sanitize()剥离完整 ANSI 序列、规整 CRLF 与裸\r、清理 C0/C1 与零宽字符- 新增
src/ttyutil.py:stty sane恢复 + 输入归一化 + 重试上限
修复:终端里按 Enter 疯狂刷 ^M
根因是 curses 会话或子进程 os._exit() 跳过了收尾,把 tty 留在 icrnl
关闭状态:回车的 \r 不再翻译成 \n 而被原样回显,input() 读到
^M 这样的垃圾串就进入无限重试。3.2.0 在 tui.py、forkexec.py、
oobe.py 三处退出路径都接上了兜底恢复。
修复:子进程输出丢失、后台作业挂死
stdio 中继原先用 multiprocessing.Pipe,那是 send_bytes / recv_bytes
的消息帧协议(4 字节长度头 + 负载),而中继写的是裸字节流——父进程
把裸文本当成长度头,recv_bytes 直接 EOF,输出线程静默死掉。现已改为
裸 os.pipe()。
同时修正了两个逻辑错误:Linux(fork) 下前台作业完全绕过中继(孙进程
直接继承父 tty,污染 shell 状态);后台作业的 stdin 管道写端从不关闭,
导致 input() 永久阻塞。
工具链与整理
- SpaceConfig v2:转义、行尾注释、
null、列表、Schema 校验 - 命令注册表:分组 help、
help <cmd>、Tab 补全、PATH=apps/ - 真出厂重置(
src/common/reset.py),8 类数据清理 main.py拆分至src/shell/*,保留兼容 facade
其他修复
open沙箱 builtins 白名单过窄,导致 apps 全线NameError- apps 在 EOF 下无限空转(
zzlsb等) zzlsb的FOOD_OPTIONS越界,1/6 概率一开局就崩- Pipe 端点接反、
TypeError语义混淆、curses 多窗口覆盖
工程
- 测试扩至 112 项,含 pty 端到端复现脚本
- 新增 GitHub Actions:lint + ubuntu/macOS/windows × 3.10/3.12/3.14
pyproject.toml补齐项目元数据,requires-python = ">=3.10"
已知问题
- OTA 云端维护中,默认关闭(
src/pyspos.py: OTA_ENABLED);本地安装与回滚不受影响 AUTHKEY是硬编码的本地 IPC 认证串,监听127.0.0.1,后续应改为运行时随机生成
许可
MIT