1.知识准备
1-0 小前言
在 Linux 世界里,Shell 是用户最熟悉的程序之一。它既不是黑魔法,也不是操作系统本身,只是一个运行在用户态的程序。它的工作像一个传声筒:读取指令 -> 翻译给内核 -> 把结果拿回来。今天,我们用 C++ 从零实现一个简单的 Shell。
1-1 Shell 是什么
Shell 的中文意思是'壳'。想象一下坚果或者鸡蛋:
- 核心(Kernel):坚果的果肉。这是操作系统最核心的部分,直接管理 CPU、内存等硬件。
- 外壳(Shell):坚果的硬壳。包裹在核心外面,保护核心。
- 用户(User):我们在壳外面。 结论:Shell 就是包裹在操作系统内核外面的一层软件壳。它是用户和内核之间的翻译官。
1-2 必备的 exec 系列函数
exec 系列函数用于替换当前进程的映像。如果说 fork() 是分身术,那么 exec 系列函数就是夺舍。当一个进程调用 exec 函数时,它的身体(PCB、进程 ID)还是原来的,但是灵魂(代码段、数据段、堆栈)被完全替换了。一句话总结:exec 只有去,没有回。
1-2-1 execl 函数
#include <stdio.h>
#include <unistd.h>
int main() {
printf("这是我的进程\n");
// 参数列表以 NULL 结尾
execl("/bin/ls", "ls", "-a", "-l", NULL);
// 如果 execl 成功,下面这行永远不会执行
perror("execl failed");
return 0;
}
1-2-2 execv 函数
v 代表数组。我们需要把自己需要的指令放在一个数组里面。
#include <unistd.h>
#include <stdio.h>
int main() {
printf("Before exec\n");
* args[] = {, , , };
ret = (, args);
();
;
}


