【问题标题】:Is there a lower-level C API than glibc on Linux? [duplicate]Linux 上是否有比 glibc 更低级别的 C API? [复制]
【发布时间】:2021-09-18 18:15:36
【问题描述】:

如果我们想创建原生 Linux 应用,我们需要使用glibc C API。如果我是正确的,glibc API 本身会调用 Linux C API。现在我有两个问题:

  1. Linux C API 是否可供程序员使用,或者glibc 是我们可以使用的最低值? (在 C 语言中最低,不是汇编语言)

  2. 其他更高级别的框架使用什么? (.NET Core、Java、Python 等)他们使用glibc API 还是直接与内核对话? (就像glibc 本身)

【问题讨论】:

  • 定义“最低”。 What do other higher-level frameworks use?你不能一概而论。每一个高级“框架”都使用其他东西。而.NET绝对不用glibc...而且通常程序使用可用的C库,不一定是glibc,可以是其他任何东西。
  • 有一些 Linux 发行版不使用 GNU libc。例如,Alpine Linux 使用 musl libc。当然还有其他使用 Linux 内核构建的系统,例如使用 Bionic 的 Android。 Linux 的其他 libc 实现包括 uClibc 和可能的 NewLib(但 NewLib 主要用于使用裸机或 RTOS 风格的微内核的系统)。
  • Linux 系统调用接口因不同的体系结构而不同(包括不同的系统调用集、不同的系统调用编号或特定系统调用的不同行为),因此 libc 实现抽象出许多这些实现细节(尽管各种系统类型的大小和long int 和指针等基本C 类型的大小以及基本C 类型的对齐大小仍然存在差异。

标签: linux linux-kernel glibc


【解决方案1】:

我的第一个问题是,“你为什么要这样做?”。 glibc 提供 C 标准库。来自the gnu site iself

GNU C 库项目为 GNU 提供核心库 系统和 GNU/Linux 系统,以及许多其他使用 Linux 作为内核。

也就是说,您可以尝试使用 Linux 系统调用 syscalls(2)。请参阅 (linux man page)。

至于其他框架,好吧,至少我见过python写的:

Linux Python 解释器本身是用 Linux/Unix C 编写的,并且 使用操作系统 C 内核调用。

(请参阅this answer on quora,我通过谷歌搜索“Python 如何与 linux 内核交互?”。)

Ian Abbot 在此处的评论中补充说,Quora 引用没有解释它如何使用系统调用(通过 libc)。他建议您可以通过检查 ldd /usr/bin/python 的输出并在输出中看到 libc.so.6 来判断它使用 libc(如果它正在使用当前的 glibc)。我试过了,也看到了。对于 /usr/bin/java 也是如此...

【讨论】:

  • 好吧,我问这个问题是因为我到处都读到大多数语言和框架都是用 C 编写的。我还在阅读“Linux 编程接口”一书,它基于 glibc (迄今为止)。如果我理解正确的话,这里有一个没有人提及的隐藏层。如果有人想创建一种新的语言和框架,glibc 是他们所需要的,还是他们必须深入挖掘?
  • 如果你是用 C 语言编写的,你大概会使用 glibc。如果你用另一种语言(汇编?)编写它,你可能不得不使用 glibc 使用的系统调用。
  • Python解释器也使用系统的libc。
  • @IanAbbott - 这是有道理的,也是我所想的,除了我看到别人写的东西(但这是一个未经证实的变化)。如果你有这个建议的来源,我可以编辑它。
  • quora 上的答案并没有说 如何 它使用系统调用(通过 libc)。您可以通过检查ldd /usr/bin/python 的输出并在输出中看到libc.so.6 来判断它使用了libc(如果它正在使用当前的glibc)。
【解决方案2】:

如果我们想创建原生 Linux 应用,我们需要使用 glibc C APIs

嗯,这个说法是错误的。要编写可移植的 C 编程语言程序,您将使用 C 标准库。 glibc 是 C 标准库的实现之一,但还有其他实现。要编写“原生 Linux 应用程序”,您可以用汇编语言编写它,或者使用其他库,或者使用不同的编程语言。

如果我没记错的话,glibc API 本身会调用 Linux C API

系统调用是与内核进行通信的方式。还带有Linux内核。我不认为我想将系统调用称为“C API”,它更多的是汇编 API 或机器代码 API,并且围绕它构建了 C API。

Linux C API 是否可供程序员使用,还是 glibc 是我们可以使用的最低版本?

假设你可以在 Linux 上使用 C 语言的“最低”是调用syscall()

其他更高级别的框架使用什么?

它特定于那个特定的“框架”。通常 99.9% 的时间用 C 编写的任何程序都使用该系统上可用的 C 标准库。该特定应用程序的构建过程会选择要使用的 C 标准库,而 docker 表明使用多个 C 标准库的应用程序可以在一个系统上共存。

.NET、Java、Python,

Python 是用 C 编写的,Java 见 In which language are the Java compiler and JVM written? ,我对 .NET 一无所知。

他们是使用 glibc API 还是直接与内核对话?

如果它们是针对 glibc 编译的,那么它们使用 glibc 与内核通信。但是在 Alpine 上,程序使用 musl。

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2019-12-18
    相关资源
    最近更新 更多