2013-03-27 49 views
6

由于某些原因,我需要调用一些系统调用(Linux) 我检查了'syscall'包的文档,但找不到任何关于它的信息。如何在golang中调用Linux/UNIX的系统调用

然后我刚看到一个包装Windows API的项目(https://github.com/AllenDang/w32/blob/master/kernel32.go)。我读了一下它的源代码。

它使用

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

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

我确定应该有一个类似的函数用于Linux/UNIX。有没有人可以告诉我函数的名称或在Golang中调用Linux的系统调用的方法,或者从libc.so中加载函数 ?

更多细节

我想要调用系统调用“服务”或“叉”(我想守护进程的过程中),因为我无法找到golang库提供他们。

+0

你想要做什么? 'syscall'软件包是直接系统调用接口的正确软件包,但如果不知道自己想做什么,很难给出任何建议。你不会在包的UNIX版本中发现DLL加载,因为它不是系统调用接口的一部分。 – 2013-03-27 06:20:25

+0

感谢James的回复。实际上我只是想知道如何获得系统调用接口。 – 2013-03-27 06:30:27

回答

4

目前Go标准库中没有daemon样式函数。有an open bug about adding such a feature,但它已被推迟到Go 1.1发布之后。我建议阅读错误报告,因为它不像它最先出现的那么简单。

除了拥有守护进程fork本身,还有其他一些方法可以运行守护进程。例如,像Upstart和Systemd这样的现代init守护进程可以为你管理这些守护进程。

+0

谢谢詹姆斯。我不会在我的程序中使用fork /守护进程,但我仍然想知道如何调用unix的系统调用。我发现有两个称为Syscall/Syscall6的函数,但没有任何文档。这两个函数可以用来调用unix的系统调用吗? – 2013-03-27 23:17:11

+0

'systemcall'包中的函数使您可以访问大多数系统调用(正如您在问题中正确推测的那样)。例如,'syscall.Read'将调用'SYS_read'系统调用。如果您所追求的特定系统调用未被该软件包覆盖,请特别询问它们。上面的答案涵盖了关于对进程进行守护的具体问题。 – 2013-03-28 01:25:00

+0

syscall软件包公开了(几乎)所有平台的系统调用。这个软件包的内容在不同的平台上有所不同。使用带有平台后缀的源文件,例如foo_linux.go和foo_windows.go。去构建将只编译具有匹配后缀的文件。这是将平台相关代码分解出来的一种很好且干净的方法。 – fuz 2013-03-31 21:17:24