# arg0 技法 翻 codex 源码,程序入口就看到好多 arg0 dispatch,原来这是一种经典的 Unix/Linux 编程技法。 简单地说,程序可以只发布一个可执行文件,然后创建多个不同名字的链接指向它。当我们通过不同的名字执行这个程序时,虽然内核最终加载的是同一个可执行文件,但程序收到的 `argv[0]` 参数可能不同。因此程序可以根据 `argv[0]` 的值进行逻辑分发。 经典软件 vim、gzip、busybox 等都使用过这个技法。比如,在我的 Ubuntu 机器上,`vim`、`vi`、`view`、`vimdiff` 都指向 `vim.basic`。 ``` /usr/bin/vi -> /etc/alternatives/vi -> /usr/bin/vim.basic /usr/bin/view -> /etc/alternatives/view -> /usr/bin/vim.basic /usr/bin/vimdiff -> /etc/alternatives/vimdiff -> /usr/bin/vim.basic ``` `/etc/alternatives` 是 Debian/Ubuntu 的机制,所以这里有两层 symlink。 codex 的 arg0 更加动态一些。codex 运行时,会创建类似于 `~/.codex/tmp/arg0/codex-arg0XXXX` 的临时目录,并在里面创建多个指向自身的链接,例如: ``` apply_patch -> codex applypatch -> codex codex-linux-sandbox -> codex codex-execve-wrapper -> codex ``` 随后 codex 还会修改 `PATH` 环境变量,把 arg0 临时目录放到 `PATH` 的最前面。后续 codex 及子进程 `apply_path`、`codex-linux-sandbox` 等命令时,会先命中这些临时 symlink,最终重新进入同一个 codex 可执行文件,但因为 `argv[0]` 不同,codex 就能分发到不同的内部逻辑。。