登录
首页 >  Golang >  Go问答

如何在Go语言中执行系统调用?

来源:stackoverflow

时间:2024-03-20 15:18:30 339浏览 收藏

Go语言执行系统调用的方式取决于编译的目标硬件和操作系统。在某些情况下,Go会直接调用内核,而在其他情况下,它会通过系统库进行调用。具体来说,在Solaris上,Go会通过系统libc进行调用;在Windows上,Go会使用标准DLL提供的C API;在Linux上,Go会直接调用内核。

问题内容

据我所知,在 CPython 中,open()read() - 读取文件的 API 是用 C 代码编写的。 C 代码可能调用一些知道如何进行系统调用的 C 库。

像 Go 这样的语言怎么样?现在Go本身不是用Go写的吗? Go 会在幕后调用 C 库吗?


解决方案


简短的回答是“这取决于情况”。

Go 针对硬件和操作系统的多种组合进行编译,并且它们在使用它们时都有不同的系统调用方式。

例如,Solaris 不提供稳定支持的系统调用集,因此它们会按照供应商的要求通过系统 libc。

Windows 确实支持一组相当稳定的系统调用,但它被定义为由一组标准 DLL 提供的 C API。 这些 DLL 公开的函数大多是使用单个“按数字进行系统调用”函数的垫片,但这些数字没有记录在案,并且在内核风格和版本之间有所不同(可能是故意的)。

Linux 确实提供了一组稳定且有记录的编号系统调用,因此 Go 直接调用内核。

现在请记住,对于Go来说,“直接调用内核”意味着遵循所谓的硬件和操作系统组合的ABI。例如,在 amd64 上的现代 Linux 上进行系统调用需要用某些值填充一组 CPU 寄存器,进行一些其他安排,然后发出 SYSENTER CPU 指令。

在 Windows 上,您必须使用其本机调用约定(即 stdcall,而不是 cdecl)。

本篇关于《如何在Go语言中执行系统调用?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>