在终端命令行,输入 ./aaa 执行程序,就是在 shell 里执行。
Shell 是运行在终端里的命令解释器(如 bash、zsh),负责接收用户输入的命令、解析并执行。
./aaa 就是 shell 接收到的一条命令,./ 表示当前目录,shell 用它来找到 aaa 文件。
流程:
Shell(bash/zsh)
↓
解析命令 "./aaa"
↓
fork() 创建子进程
↓
子进程调用 execve("./aaa", argv, envp)
execve 做了什么:进程替换, 提供环境变量 envp
↓
内核加载 aaa 替换当前进程,进程(PID 不变)
↓
aaa 变成当前进程,执行 aaa 程序的 main()
shell 不执行程序,shell 负责"创建进程 + 组织参数 + 提供环境变量"
PID 不变,但程序已经完全换了
shell 只做:解析命令、创建进程、调用 execve
为什么必须 fork + exec (经典设计)
Linux 设计是:
fork = 复制自己
exec = 变成别人
shell 不能直接变 aaa,否则自己就消失了
所以必须 fork 一个"副本"去执行 aaa