Shell、Kernel 和 API 有啥区别

Posted

技术标签:

【中文标题】Shell、Kernel 和 API 有啥区别【英文标题】:What is the difference between Shell, Kernel and APIShell、Kernel 和 API 有什么区别 【发布时间】:2012-08-21 08:48:54 【问题描述】:

我想了解这如何适用于操作系统以及那些不是实际操作系统的东西。我无法理解这三者之间的区别及其本质。 API是我们可以调用的函数,但是什么是Shell?如果我们有一个 API,那么操作系统的内核到底是什么?我知道操作系统有一个不会改变的核心,这个核心完成了典型操作系统的基本工作,而我们可能有不同的用户界面,如 GUI 或具有相同内核的命令行。所以问题是我很困惑这些东西有什么不同。啊啊啊啊!

C 中的 printf 和 fopen 等函数可以称为 API 调用吗?

【问题讨论】:

【参考方案1】:

Shell 是通过命令行与操作系统和内核进行通信的方式。 Shell 通过调用 API 来实现这一点。 内核确实是操作系统的核心,它负责内存管理、任务调度、文件系统处理、I/O 处理…… 内核所做的所有事情,都可以通过操作系统提供的 API 以某种方式调用。

printf 和 fopen 封装了操作系统和内核提供的系统调用 (API)

【讨论】:

【参考方案2】:

Shell:它就像操作系统的命令行界面。 ls、ps、kill 等命令可用于请求完成对操作系统的特定操作。就像windows上的“cmd”。

内核:它是任何操作系统的主要代码。您在 shell 上或通过 GUI 发出的任何请求(如内存分配、打开文件等)最终都由内核完成。

是的,您提到的调用被视为 API 调用。对这些调用的请求也由内核处理。请转到以下链接以在 unix 中查找 API 调用。 http://www.mkssoftware.com/docs/api_index.asp

这是一个unix操作系统的整体图:

应用程序=>(shell+库例程)=>系统调用=>内核

看看最终的请求处理程序是内核。 谢谢!

【讨论】:

啊哈,所以 Shell 只是一个命令行。那么windows中的cmd是windows还是DOS的Shell? 不需要,因为 Windows(和其他操作系统)不需要外壳。也许应该将 shell 重命名为操作系统服务的默认接口? 所以我们的带有所有图标的 windows GUI 环境不是 Shell 还是它? Dos提示符是Dos shell吗?另外,为了拥有 Linux Shell,我们必须在 Windows 操作系统上运行 Shell,对吗? 所以我们使用 API 与内核通信,当我们向操作系统发出直接请求时,这些 API 调用可以通过 Shell 进行,例如打开文件、更改目录等。因此,DIR 应该是 DOS 中对其内核的 API 调用?【参考方案3】:

命令行界面 (CLI) shell 是命令解释器,即处理您在命令行中输入的命令(也称为终端)或处理 shell 脚本(包含命令的文本文件)(批处理模式)。在早期的 Unix 时代,它曾经是用户与他们的机器交互的独特方式。如今,图形用户界面 (GUI) 正在成为大多数用户的首选 shell 类型。

内核是一个底层程序,它与运行应用程序的硬件(CPU、RAM、磁盘、网络……)进行交互。它是在计算机上运行的最低级别的程序,尽管通过虚拟化,您可以在虚拟机之上运行多个内核,而这些虚拟机本身又在另一个操作系统之上运行。

API 是一个通用术语,定义了开发人员在使用库和编程语言编写代码时必须使用的接口。 内核没有 API,因为它们不是库。他们确实有一个ABI,除了其他东西之外,它还定义了应用程序如何通过系统调用与他们交互。 Unix 应用程序开发人员使用标准 C 库(例如:libcglibc)来构建符合 ABI 的二进制文件。 printf(3)fopen(3) 不是系统调用的包装器,而是 (g)libc 标准设施。他们最终使用的低级系统调用是write(2)open(2),可能还有其他类似brkmmap。括号中的数字是一个约定,说明该命令在哪个手册中找到。

Unix 手册的第一卷包含 shell 命令。

第二个包含系统调用wrappers,如writeopen。它们构成了内核的接口。

第三个包含标准库(包括 Unix 标准 API)函数(不包括系统调用),如 fopenprintf。这些不是特定系统调用的包装器,而只是在需要时使用系统调用的代码。

【讨论】:

比我还想知道一件事。有没有像 Windows Shell 这样的东西?我们有一个 GUI 而不是命令行提示符的情况呢?这是我唯一不明白的最后一件事。 shell 最初是一个术语,但仍主要仅在 Unix 上下文中使用。无论如何,有一个 GUI 的事实并没有什么不同。无论您使用 Windows、Gnome 还是 KDE,您都可以在命令行窗口(终端模拟器)中运行 shell 或等效项。 恕我直言,“系统调用”是操作系统的 API,用于实现某些编程语言的跨平台标准库。实际上, fopen 和 printf 确实是系统调用的一种“包装器”。一些参考资料:***.com/questions/13179102 @Bossliaw fopenprintf 有很多特定的代码,并且彼此共享表、缓冲区和上下文。出于这个原因,我不将它们称为系统调用的包装器,尤其是例如您可以调用printf 而不涉及任何系统调用。他们只是有时碰巧最终使用系统调用,但对于每个库函数都是如此。您发布的作为参考的链接我完全同意并没有说任何与这一点相矛盾的内容。 @jyapx 是的,我不质疑这个比喻。我的观点是,一个 shell 或一组 shell 并不是操作系统的唯一最外层。有太多虚假的图表错误地将 shell(s)表示为真实的层,而它们只是像其他程序一样的程序。参见例如unix.stackexchange.com/questions/186474/…【参考方案4】:

考虑一个例子,你在 shell 上观看电影,而实际上通过硬件完成的过程是 kernelshell在用户和软件界面上类似于os,而kernel在软件和硬件上类似于os。

【讨论】:

这个例子中的 API 是什么?

以上是关于Shell、Kernel 和 API 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

shell和shell脚本 有啥区别啊

TabbedPage 导航和 Shell 选项卡导航有啥区别

c shell 和bash有啥区别

“hadoop fs”shell 命令和“hdfs dfs”shell 命令有啥区别?

Spark 中用 Scala 和 java 开发有啥区别

linux中shell分多少种,都有啥区别