【问题标题】:system calls using c library使用 c 库的系统调用
【发布时间】:2023-03-09 07:59:01
【问题描述】:

通常,系统提供位于普通程序和操作系统之间的库或 API。在类 Unix 系统上,该 API 通常是 C 库 (libc) 实现的一部分,例如 glibc,它为系统调用提供包装函数。函数如 write()、read()、open()..用于从C程序进行系统调用。这是否意味着如果Java程序必须进行系统调用,那么在最低级别它必须调用这些C库函数?如果是这样,那么如何..???

【问题讨论】:

  • 你的 vm 实现是这样做的
  • 任何语言运行时实现都需要进行操作系统调用。它可以通过使用 C 运行时库来做到这一点。这实际上不是必需的,只是常见的。
  • 在 Linux 系统上,您可以享受使用strace 运行命令并监控正在执行的系统调用。 Windows 的模拟工具是procmon。例如,您会看到每次执行 I/O 时,都会涉及到相应的系统调用。
  • 引用 SICP,“解释和运行计算机程序的解释器只是另一个计算机程序。” --java虚拟机,概念上,是java字节码的解释器; jit 是一种速度优化。更严重的是,您可以定义和实现一个小得可笑的虚拟机(例如,使用一条指令来打印给定字符)并注意您是否最终调用了那些 C 库函数。

标签: c system systems-programming


【解决方案1】:

如果您确实需要,可以使用 Java 本地接口 (JNI) 来实现。

注意这不是为了装腔作势; JVM 通常可以为所欲为。

JNI 的一个用例是在 Java 中使用 OpenSSL 进行加密;当我测试它时(大约 10 年前),这过去要快得多。

http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

【讨论】:

    【解决方案2】:

    我假设您不想知道如何在 Java 中执行此操作,因为该问题未标记为 Java 问题。

    所以 libc 是正确的方法,但为了提供信息,在 linux 中,您可以使用 syscall 函数。 syscall 函数可以使用 Int 0x80 信号、sysenter 指令或其他内容,具体取决于平台。

    Introduction to System Calls in Linux

    【讨论】:

      【解决方案3】:

      在 Java 中,这是使用 native Methods 完成的。这些是使用native 修饰符声明的方法,并且(类似于abstract 方法)没有主体,其实际实现是用平台相关的语言编写的,通常是C。

      可以使用System.loadLibrary(String libraryName) 在运行时加载其他本机方法实现。

      【讨论】:

        猜你喜欢
        • 2016-02-09
        • 2015-04-26
        • 2016-01-06
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多