用户程序通过调用操作系统提供的系统调用(system call)API 来获得操作系统提供的各种服务。但使用 API 需要手动编写程序。对于不编程序、且需要与操作系统进行交互的用户,又如何使用操作系统的服务呢?

为了向那些不编程的用户提供服务,操作系统提供了一个壳(shell)来与用户交互。 每个操作系统都会提供某种壳以便与用户进行交互。正如蛋壳(eggshell)之于内部的蛋清(egg white)和蛋黄(egg yolk),操作系统提供的壳(“os shell”)是覆盖在操作系统服务上面的一个用户界面(user interface),一般分为如下两种形式:

  • 既可以是图形方式的(GUI, Graphical User Interface):Windows
    • windows 中,启动壳需要执行 explore.exe,也即 windows 的资源管理器
  • 也可以是文本形式的:UNIX,Linux;
    • 启动一个壳,只需要运行 shell 即可,可以同时启动多个壳;

用户在这个界面上输入命令,操作系统则执行这些命令。当然,用户输入的命令不是直接的操作系统服务,而是所谓的 utilities(工具)。这里 utilities 的功能相当于 C 语言中的库函数。用户无法直接调用系统调用。壳上的用户不能直接使用操作系统提供的服务。

1. 一个壳的具体功能

  • 显示提示符(prompt)
  • 接受用户命令并执行;
  • 启动后台进程;
  • 进行工作控制;
  • 提供薇伪终端服务;

2. 一个简单的壳实现

while (true) {
    type_prompt();                           // 显示命令提示符;
    read_command(command, parameters);       // 获取用户输入的命令,及参数
    if (fork() == 0) {                       // fork 一个子进程;
        execute(command, parameters, 0);     // 子进程代码,执行用户命令
    } else {                                 // 父进程代码段
        waitpid(-1, &status, 0);             // 等待子进程结束;
    }
}