【发布时间】:2013-05-07 17:07:27
【问题描述】:
在研究我的另一个问题Go package syscall conn.Read() is non-blocking and cause high CPU usage时,我阅读了syscall包中的源代码。
自从我在 OS X 10.8.3 上找到我的上一期以来,这里是相关的源代码:
http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go?h=Read#L898
我不知道Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) 是什么意思,实际上我不懂unsafe.Pointer 和Syscall() 之类的东西。它们是如何工作的?
此外,任何人都可以解释评论// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT,这些东西如何以及为什么通过不同的实现在特定平台上工作?以及syscall 包是如何生成这些接口的?
如果有人可以解释与syscall 相关的Read() 等特定功能,可以帮助我更好地理解它,谢谢。
【问题讨论】:
-
Syscall(...) 看起来像来自 C 的旧 syscall() 函数的 Go-ish 版本。这个(可变参数)函数允许您通过提供系统调用号来执行任意系统调用(here it是 SYS_READ) 和一组参数。
-
我想this link 会为你澄清很多。
-
syscall包提供对低级 os 系统调用的访问。 C 语言版本在man(2)中(所以man read会告诉你 syscall.Read 的作用)——我认为它们与 Go 系统调用同名,只是没有大写字母。该文件可能是自动生成的,因为它包含许多包装不同系统调用的几乎相同的 Go 函数。
标签: linux unix go system-calls darwin