Codex 系统手册

进程入口点和二进制分发

stage-165 个文件

这一阶段就是原生程序刚启动时的“门口分流”。用户敲下 codex,或启动 app-server、codex-exec 等小程序后,入口代码先看程序名 argv[0] 和用户写的参数;clap 这个参数解析工具会把选项整理清楚。主要入口像总服务台,决定去终端界面、一次性执行、登录或维护命令。辅助工具像旁边的工具箱,负责生成协议、打补丁、找文件、开后台服务和跑沙箱。exec 的入口还会判断自己是普通执行器,还是 Linux 沙箱工具,然后把活交给对应模块。

子阶段

本阶段涉及的状态3
  • reg-effective-config系统最终采用的那份配置,把文件、云端规则、项目设置、命令行参数和临时覆盖合在一起,后面各模块都按它办事。
  • reg-exec-environment-processesexec-server 和统一执行层里正在运行或已经结束的进程、退出码、输入输出和失败原因。
  • reg-invocation-dispatch-state本次进程启动选择的入口模式、子命令和早期解析参数,决定后续走 TUI、exec、登录、服务器或维护流程。

本阶段的文件1

进程入口点和二进制分发

exec/src/main.rs源码 ↗
entrypointstartup

这个文件像一个前台接待员:同一个可执行文件被叫不同名字时,要带用户去不同窗口办事。正常叫 codex-exec 时,它会解析命令行参数,启动非交互式的 Codex agent,也就是不用聊天界面、直接执行任务的模式。但如果启动时的程序名是 codex-linux-sandbox,它会走另一套沙箱逻辑,在 Linux 的 Landlock 和 seccomp 保护下运行命令;可以简单理解成把命令关进一个权限更小的房间里,减少它乱碰系统的机会。文件里还把顶层的配置覆盖项合并进真正的内部命令参数中,这样后面的代码不用关心这些参数原来写在外层还是内层。没有这个入口,程序就不知道该解析哪些参数、启动哪条路线,也没法用同一个二进制文件承载两种不同功能。

函数细节1
main28–40 ↗
fn main() -> anyhow::Result<()>

作用:这是程序启动后的第一站。它判断当前启动方式,解析命令行参数,把配置整理好,然后把真正的工作交给后面的执行逻辑。

数据流:进去的是操作系统传给程序的启动信息和命令行参数,包括程序自己被叫什么名字以及用户写的选项。它先通过 arg0_dispatch_or_else 检查启动名是否需要走特殊分支;如果走普通 codex-exec 路线,就解析出 TopCli,再把外层配置覆盖项塞到内部 CLI 参数前面,最后调用 run_main 启动主流程。出来的是一个成功或失败的结果;如果中途解析或运行出错,错误会向上传回给运行环境。

调用关系:它位于整个程序的最外层,是所有后续工作的入口。它把“根据程序名分流”的事情交给外部函数 arg0_dispatch_or_else,自己只在普通路径里整理参数,并把整理后的命令交给 run_main 继续执行。这样沙箱工具和普通执行器可以共用同一个二进制文件,但启动时仍然各走各的流程。

调用图:外部调用 1 个(arg0_dispatch_or_else)。