步骤 3 / 6
exec:换上新程序
子进程调用 execve,把自己整个换成 ls。
exec 不创建新进程,而是把当前进程的代码和内存替换成另一个程序,从头运行。 PID 和打开的文件保留下来,所以 bash 可以在 exec 之前先把输出重定向到文件。 这就是拆成两步的好处:中间留出了“布置环境”的机会。
操作系统
在终端敲下一个命令,bash 是怎样把它变成一个新运行的程序的。
以在 Linux 的 bash 里输入 ls 为例。
步骤 3 / 6
子进程调用 execve,把自己整个换成 ls。
exec 不创建新进程,而是把当前进程的代码和内存替换成另一个程序,从头运行。 PID 和打开的文件保留下来,所以 bash 可以在 exec 之前先把输出重定向到文件。 这就是拆成两步的好处:中间留出了“布置环境”的机会。
| 当前状态 | 发生了什么 |
|---|---|
| bash 运行中 | 用户输入 ls,bash 需要启动一个新程序 |
| 父子两个进程 | 内核复制出子进程 |
| 子进程运行 ls | 子进程变成了 ls |