如何在 Golang 中调用 Linux/UNIX 的系统调用

6

由于某些原因,我需要调用系统(Linux)的一些系统调用。我查阅了'syscall'包的文档,但没有找到相关信息。

后来我看到了一个项目(https://github.com/AllenDang/w32/blob/master/kernel32.go),它封装了Windows API。我稍微阅读了一下其源代码。

它使用了

modkernel32 = syscall.NewLazyDLL("kernel32.dll")

加载动态库的函数为NewLazyDLL(),但是没有关于该函数的文档。

我确定Linux/UNIX应该有类似的函数。有人能告诉我该函数的名称或者如何在Golang中调用Linux的系统调用或者从libc.so中加载函数吗?

更多细节

我想要调用系统调用'daemon'或者'fork'(我想要将进程变成守护进程),因为我找不到提供这些功能的golang库。


你到底想做什么?syscall包是直接系统调用接口的正确包,但是如果不知道你想做什么,很难给出任何建议。在该包的UNIX版本中,你不会找到DLL加载,因为那不是系统调用接口的一部分。 - James Henstridge
谢谢詹姆斯的回复。实际上我只是想知道如何获取系统调用接口。 - Janus.Le
1个回答

3
目前 Go 标准库中没有守护进程风格的函数。有一个关于添加此功能的开放性错误报告,但已被推迟至 Go 1.1 发布后。建议阅读错误报告,了解其中的原因并使其更加简单明了。除了守护程序自身分叉之外,还有其他运行守护进程的方法。例如,现代 init 守护程序(如 Upstart 和 Systemd)可以为您管理这些守护进程。

谢谢James。我不会在我的程序中使用fork/daemon,但我仍然想知道如何调用Unix的系统调用。我发现有两个名为Syscall/Syscall6的函数,但没有任何文档。这两个函数是否可以用于调用Unix的系统调用? - Janus.Le
systemcall 包中的函数可以让你访问大多数系统调用(正如你在问题中正确猜测的那样)。例如,syscall.Read 将调用 SYS_read 系统调用。如果你需要的特定系统调用没有被该包覆盖,请具体询问。上面的回答涵盖了你关于将进程变为守护进程的具体问题。 - James Henstridge
syscall包公开(几乎)平台上的所有系统调用。该包的内容在不同平台之间是不同的。使用带有平台后缀的源文件,例如foo_linux.go和foo_windows.go。go build只会编译具有匹配后缀的文件。这是一种很好、干净的方法来分离平台相关的代码。 - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接