MUNDERDIFFLIN / LEARN
CHAPTER 08
05 · PROCESS RUNTIME11 分钟阅读深入

PTY 把外部 CLI 变成可管理 Worker

PtyManager 统一 spawn、输入、输出、resize、redraw、kill 与 quit sweep;它管理 OS 进程生命周期,但不实现模型 runtime。

本课核心问题为什么 PTY 不是一个可随意替换的 child_process?
学完你能
  • 理解终端语义、session 映射和进程树回收。
  • 解释 Windows 与 Unix 的生命周期差异。
01
生命周期

从 resolved command 到进程树清理

session map 以 ptyId 为键,保证一个 id 只有一个当前 owner。spawn 成功后注册 onData/onExit;显式 kill 会先杀 PTY、验证进程树,再同步移除 session;自然退出走相同 teardown hook。

交互图解

PTY 生命周期与重启保护

validateid / cwd / command
resolvePATH / Windows shim
spawnxterm-256color
streamdata / write / resize
exitidentity guard
reapprocess tree cleanup
同一个 ptyId 可重用,但 session identity 防止旧进程回调污染新会话。
02
跨平台差异

Windows 的难点不是 shell 名称,而是 shim、argv 与 ConPTY

CreateProcess 不能直接执行 .cmd/.bat。实现优先解析 npm shim,直接启动其 interpreter + script,以保留多行 Hive prompt;解析失败才退回 cmd.exe,并显式警告多行参数会被截断。

  • 01Unix 使用已缓存的交互式 shell PATH;Windows 继承 PATH 并追加 Hive runtime fallback。
  • 02Missing-CLI installer 走平台 shell;正常 CLI 尽量避免 shell parser。
  • 03killAll 在 Windows 先同步 hardKillTree,再关闭 ConPTY,避免父进程退出后丢失后代。
03
故障与恢复

同 id restart 通过 session identity guard 避免竞争

kill 后马上以同 ptyId respawn 时,旧进程可能稍后才触发 onData/onExit。回调会检查 sessions.get(id) 是否仍是自己;不是就丢弃尾部输出和 stale exit。

SOURCE FACT

Sleep/wake 检查只用 signal 0 探测并通知,不自动替用户重启;真正 revive 仍由 renderer 的 spawn 流程负责。

04
生命周期不变量

用三个 id 和一条回收链证明没有孤儿进程

Agent id、内部 PTY session id 与 OS pid 用途不同。任何关闭入口都应先解析到唯一 session,再对其进程树执行幂等回收并广播最终状态。

关掉屏幕不等于关掉机器;删掉 UI tab 也不等于终止 CLI。

LESSON CHECKPOINT

能用自己的话回答核心问题了吗?

PTY 同时是传输层、交互设备和生命周期边界。