operating-system - 非 c 语言如何与操作系统交互?

标签 operating-system programming-languages system-calls

在 linux 上(例如),我们可以直接使用 OS 提供的 api(open/close/read/write)进行系统调用,也可以使用 C 中 libc 提供的函数(fopen 等)。

它是如何在其他语言中实现的?

最佳答案

你最初的前提是错误的:在 Linux 上,当你打电话时,比如说, open(2) 在您的 C 代码中,您不是在进行系统调用,而是调用 glibc 提供的函数。 (或您的程序碰巧使用的 C 标准库的任何实现——还有其他的,例如 μLibcdietlibc 等),并且该函数的实现实际上使系统调用——正确地进行必要的设置以符合到目标架构的ABI公约。

您可以直接在 C 中进行系统调用,但它看起来与仅调用 open() 有很大不同。 ;一些指针是thisthis .

回顾一下:the POSIX standard (指定 open(2) 和 friend 的外观和行为方式)只指定了一个相当高级的接口(interface)(就 C 编程语言而言),但实现该标准的具体内核有自己的一组系统调用和约定如何调用它们(在同一内核的 H/W 架构之间有所不同),它是 C 标准库,它“知道”如何调用一个具体的内核,它确保调用 POSIX API 的 C 程序最终使用适当的系统调用适当的设置。换句话说,在 Linux 上运行的典型 C 应用程序中,您并没有直接处理系统调用——您只是有一个印象。

其他语言/运行时基本上有两种选择:

  • 取决于目标平台的libc并依靠它在它们和内核之间进行调解。
  • 直接实现调用目标内核必要的系统调用。

  • 我知道的大多数语言/运行时都采用第一条路线(Python、Java 等等),而其中一些采用另一条路线——例如,Go 的引用实现, Free Pascal .

    2014 年 10 月 13 日更新 回答 @tan 的问题的评论:

    So, if the first route (libc) is taken, how are libc functions invoked from python/java?



    基本上,该方法类似于系统调用的方法:再次调用 C 对于硬件体系结构和 C 编译器的每种组合都是标准化的。见 this discussion了解更多信息和进一步的指示。

    请注意,实际上,大多数能够与 C 代码交互的软件都使用以下两种方法之一:
  • 它本身是用 C 语言编写的,因此在外部 C 代码中实现对动态或静态链接的调用由编译调用软件的编译器处理。

    也就是说,您的软件唯一必须关心的是正确安排其数据以供 C 端操作。一个例子是确保传递给 C 端的内存块在 C 端完成之前不会被垃圾收集。

    cgo subsystem Go 编程语言的例子就是这种方法的一个例子。
  • 调用软件使用一个库(通常用 C 编写以利用 C 编译器可以为它做的事情),该库能够加载 C 动态库并正确调用它们的函数来执行所有必需的数据设置。见 this了解更多信息。

    Python的 ctypes 模块正是实现了这种方法。

  • 我很难对 Java 的 JNI 进行分类和 .NET 的 P/Invoke分为这两类。可能他们坐在中间的某个地方。

    关于operating-system - 非 c 语言如何与操作系统交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297151/

    相关文章:

    Git core.autocrlf 行尾默认设置

    windows - 为什么 "Executable files"依赖于操作系统?

    programming-languages - 仅键入接口(interface)

    c - 如何使用 LD_PRELOAD 包装 ioctl(int d, unsigned long request, ...)?

    go - 在 win7-64 中调用 dll 时,golang syscall 遇到一些问题

    c++ - 是否可以从 ELF Core 文件中删除堆?

    memory - 为什么 32 位操作系统支持 4 GB RAM?

    language-agnostic - Smalltalk带来了哪些创新(例如MVC,xunit和Hotspot)?

    c# - 如果三个参数中只有一个或两个为真,则返回 True 的代码

    c++ - 如何在 ubuntu 中使用 C++ 打开 "Open directory"GUI?