了解 Go 中的 Syscall.RawSyscall() 和 Syscall.Syscall()
对于那些刚接触 Go 系统调用包的人来说,Syscall.RawSyscall () 和 Syscall.Syscall() 函数可能令人望而生畏。以下是澄清其细微差别的详细概述:
Syscall.RawSyscall()
参数:
返回值:
汇编代码实现:
对于 Darwin/amd64 系统,Syscall.RawSyscall() 的汇编代码可以在这里找到:https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall
Syscall.Syscall()
Syscall.Syscall () 与 Syscall.RawSyscall() 的不同之处仅在于在执行系统调用之前和之后调用了runtime.entersyscall() 和runtime.exitsyscall() 函数。这允许 Go 运行时跟踪和控制 goroutine 对系统调用的使用。
用法:
通常应使用 Syscall.Syscall() 而不是 Syscall.RawSyscall () 对于大多数目的。 Syscall.Syscall() 处理 Goroutine 上下文切换,从而实现抢占和多任务处理。仅当您有绕过运行时上下文切换机制的特定需要时才使用 Syscall.RawSyscall()。
示例:
要编写自己的系统调用函数,一种方法是是:
但是,此示例需要深入了解汇编编程和系统级知识详细信息,因此建议尽可能使用 Syscall.Syscall()。
以上是Go 中的 `Syscall.RawSyscall()` 和 `Syscall.Syscall()` 有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!