Skip to content

Releases: ViudiraTech/PySpOS

v3.2.0 — 真子进程、OOBE 向导、终端输入自愈

Choose a tag to compare

@JiTianYu391 JiTianYu391 released this 24 Sep 10:54

进程与调度

  • 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