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

Operating system 非c语言如何与操作系统交互?,operating-system,programming-languages,system-calls,Operating System,Programming Languages,System Calls,例如,在linux上,我们可以使用OS提供的api(打开/关闭/读/写)直接进行系统调用,也可以使用C中libc(fopen等)提供的函数 在其他语言中它是如何实现的?在其他语言中,这通常(总是?)是通过围绕本机函数调用的包装器实现的。实际上,它看起来是这样的。 LanguageX->包装器->本机代码(C/C++) 有时,这个包装器采用整个框架的形式,比如for java。 这对于Groovy脚本也非常有用 对于某些语言,您可以使用类似于C/C++的方式将本机DLL直接加载到应用程序中。在使用

例如,在linux上,我们可以使用OS提供的api(打开/关闭/读/写)直接进行系统调用,也可以使用C中libc(fopen等)提供的函数


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

在其他语言中,这通常(总是?)是通过围绕本机函数调用的包装器实现的。实际上,它看起来是这样的。 LanguageX->包装器->本机代码(C/C++)

有时,这个包装器采用整个框架的形式,比如for java。 这对于Groovy脚本也非常有用

对于某些语言,您可以使用类似于C/C++的方式将本机DLL直接加载到应用程序中。在使用Python的情况下也是如此

其他时候,根本不需要本机调用,可以直接使用您选择的语言生成相同的结果。跨平台GUI工具包是一个可以完全替换本机操作系统调用的小例子。例如GTK或QT


希望这能澄清一点:)如果您想了解其他特定于语言的详细信息,请告诉我。

您最初的前提是错误的:在Linux上,当您调用(比如)C代码时,您不是在进行系统调用,而是在调用(或者您的程序碰巧使用的C标准库的任何实现,还有其他实现,例如,等等),该函数的实现实际上使系统调用正确地进行必要的设置,以符合目标体系结构的约定

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

概括地说:(指定
open(2)
和friends应该是什么样子和行为的)只指定了一个相当高级的接口(就C编程语言而言),但是实现这个标准的具体内核有自己的系统调用集和如何调用它们的约定(同一内核的H/W架构不同),C标准库“知道”如何调用一个具体的内核,以确保调用POSIXAPI的C程序最终使用具有适当设置的适当系统调用

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

  • 依赖于目标平台的
    libc
    ,并依靠它在它们和内核之间进行调解
  • 直接实现调用目标内核的必要系统调用
我所知道的大多数语言/运行时都采用第一种方式(Python、Java等),而有些语言/运行时则采用另一种方式,例如的参考实现

更新2014-10-13回答
@tan
评论中的问题:

那么,如果采用第一条路径(libc),那么如何从python/java调用libc函数呢

基本上,这种方法与系统调用的方法类似:对于硬件体系结构和C编译器的每一种组合,调用C也是一种标准化的方法

请注意,实际上,大多数能够与C代码接口的软件都使用以下两种方法之一:

  • 它本身是用C编写的,因此,在外部C代码中实现动态或静态链接的调用由编译调用软件的编译器处理

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

    Go编程语言的应用就是这种方法的一个例子

  • 调用软件使用一个库(通常用C编写,以利用C编译器可以为它做的事情),该库能够加载C动态库并正确调用它们的函数来执行所有必需的数据设置。有关更多信息,请参阅

    Python的模块正好实现了这种方法


<> P> >将java的<代码> java NI/Cuff>和.NET的代码> p>调用/<代码>这两个类别比较困难。它们可能位于中间的某个位置。本机DLL直接。为澄清而编辑。谢谢。这是我一直在寻找的。不过,了解包装器的具体工作原理会很有趣。这将是一个相当深入的问题,稍微超出了问题的范围。请参阅。在本例中,包装器库将是某种形式的本机接口。kostix answer描述了这一点s all在内部工作,而我的答案更多的是从用户的角度进行概述。是的。我相信API(如打开/关闭)的实现会设置一些东西(要共享的参数、返回堆栈指针等),并有一些汇编代码来发送s/w中断(例如陷阱)对于C程序,这些库将在运行时加载并调用,就像任何库一样。因此,如果采用第一条路径(libc),那么如何从python/java调用libc函数?@tan,更新了我的答案以解决您评论中的问题。