一般来说,系统提供位于普通程序和操作系统之间的库或 API。在类 Unix 系统上,该 API 通常是 C 库 (libc) 实现的一部分,例如 glibc,它为系统调用提供包装函数。在 C 中,我可以使用这些包装函数进行系统调用。如何用其他语言进行系统调用?
答案1
大多数时候,您选择的语言将提供最终映射到相关的功能(某种类型)系统调用。在这些情况下,只需使用它们即可,今天就到此为止;根本不需要考虑系统调用接口。事实上,我认为除非您正在编写标准库,否则不需要首先考虑较低级别的细节。这与最初的 IBM PC 时代不同,直接访问内存结构可以显着提高性能(即使在那时,它也被认为是非最佳解决方案,因为它严重限制了可移植性)。
也就是说,您可以使用任何允许您的语言执行直接系统调用模仿预期的调用约定。事实上,这与任何二进制间调用(包括库调用)并没有什么不同(尽管对于库来说,这通常不是什么问题,因为无论如何这些都可能被写入相同的调用约定)。
调用约定规定了参数和返回值如何传入和传出被调用函数之类的内容,并构成了调用约定的一部分ABI(应用程序二进制接口)一个平台的。请注意,在这种情况下,“平台”是一个相当广泛的术语,可能涵盖操作系统、运行时环境、语言、编译器和设置(包括源代码级声明)。
所以你需要做的是让您的其他语言进行符合所使用的调用约定的函数调用然后只需调用相应的接口即可。如果您使用的是汇编程序,那么这很简单,因为您很可能已经自己完成了所有参数和结果的传递;如果您使用的是 BASIC 或 Perl 等极端的东西,您将很难遵守外国调用约定,因为这些语言几乎缺乏这个概念。
确切地说,如何编写代码以使用备用(或特定)调用约定在很大程度上取决于所讨论的语言(以及可能的编译器),并且范围太广,无法一般回答。当然,您需要知道要遵守哪种调用约定。