首页 > 解决方案 > glibc 和 POSIX 到底是什么?

问题描述

我真的很困惑。请看下图: 在此处输入图像描述 我发现linux中有一个叫做glibc的库,当我们执行我们的c/c++程序时,我们使用它的函数并调用适当的系统调用。事实上,它是我们可以使用的 API。但我很困惑。glibc 是否安装了我们用于 c/c++ 程序的操作系统?因此,当我们编写 python/ruby/... 程序时,没有标准库或 API,例如 glibc,我们调用它的函数并且它调用适当的系统调用。那么我们在 python/ruby/... 中的代码是如何运行的呢?另外,什么是POSIX?我读了维基百科,但我无法理解。它与 glibc 有什么关系?请给我一些我能找到的例子和简单的解释

标签: apioperating-systemposixglibclibc

解决方案


POSIX 是用于标准化操作系统的计算机标准。否则操作系统将是完全不同的,它们之间不会有任何共同点(有点像微软对 Windows 所做的)。开放标准(与 Windows 不同)以某些复杂的方式使计算更易于访问和负担得起。今天,您可能会认为 Linux 在某些方面是一个促进开源计算和免费/负担得起的计算的非营利组织。Linux 的网站大多在 .org 中,因为它们是促进开放计算工作的有机体。

同时,UNIX 是一个兼容 POSIX 的操作系统。

由于 glibc 在 Linux 上工作并且 Linux 非常类似于 UNIX(请参阅https://www.quora.com/Is-Linux-compatible-with-UNIX),因此 glibc 应该在 UNIX 系统上工作。由于 UNIX 与 POSIX 兼容(请参阅https://linuxhint.com/is_linux_posix_compliant/),因此 Linux 大多与 POSIX 兼容。

对于所有这些相关的内容,您可以在此处查看我在 cs.stackexchange.com 上的答案https://cs.stackexchange.com/questions/136298/how-are-kernels-and-operating-systems-in-general-written-在-c/136330#136330

当您在 Linux 上编写 C 应用程序时,您包含来自 glibc 的标头以使用诸如 malloc、fork 等标准函数。当您编译您的应用程序时,您可以静态或动态编译它。当您静态编译它时,您会将所有内核代码包含在可执行文件中,就像 mmap 的代码一样。基本上,当从主函数调用 mmap 时,CPU 会跳转到映射到虚拟内存中的函数。它“停止”包括代码的地方是当您在较旧的 x86 32 位处理器上使用 int 0x80 跳转到内核代码时。老实说,我不知道 x86-64 的系统调用约定。它可能是相似的。当您的代码在 x86 上调用 int 0x80 时,它会中断 CPU 并跳转到所有进程共享的内核代码。此内核代码不能包含在您的可执行文件中,因为它是中断代码。因此 mmap 包含在您的可执行文件中,直到系统调用。其余的工作在中断处理程序中完成,然后返回到 mmap,它现在具有已分配内存块的新地址。然后 mmap 返回到 glibc 调用者,正如你所说,它是内核代码调用的包装器。当您动态链接时,除了链接发生在运行时之前,它是相同的。

POSIX 与 glibc 相关,因为 POSIX 定义了将由 glibc 调用以实现 C 约定的标准 API。这实际上是约定之上的约定。C 约定是另一种约定。它说:如果你写这个,那么这应该是运行程序后的结果。Glibc 确实希望在 Linux 等符合 POSIX 的系统上实现 C 约定。

同时,Python/Ruby 等是高级语言,主要是用 C++/C 等低级语言编写的。运行 Python 命令的 Python 程序是用 C 语言编写并编译的。然后您编写一个 Python 程序,然后在运行时由 C 程序解释该程序。真的没有什么神奇的。它只是约定优于约定的约定。POSIX 实现了 glibc 用于实现 C 约定的系统调用标准,Python 使用该约定来实现在运行时解释 Python 程序的 Python shell。


推荐阅读