【问题标题】:How can I invoke system call of Linux/UNIX in golang如何在 golang 中调用 Linux/UNIX 的系统调用
【发布时间】:2013-03-17 04:19:39
【问题描述】:

由于某些原因,我需要调用系统的一些系统调用(Linux) 我检查了“系统调用”包的文档,但找不到任何关于它的信息。

然后我刚刚看到一个项目(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的回复。其实我只是想知道如何获取系统调用接口。

标签: go system-calls


【解决方案1】:

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

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

【讨论】:

  • 谢谢詹姆斯。我不会在我的程序中使用 fork/daemon,但我仍然想知道如何调用 unix 的系统调用。我发现有两个函数称为 Syscall/Syscall6,但没有任何文档。这两个函数可以用来调用unix的系统调用吗?
  • systemcall 包中的函数使您可以访问大多数系统调用(正如您在问题中正确推测的那样)。例如,syscall.Read 将调用SYS_read 系统调用。如果软件包未涵盖您所追求的特定系统调用,请具体询问它们。上面的答案涵盖了您关于守护进程的具体问题。
  • 系统调用包暴露了(几乎)你所在平台的所有系统调用。这个包的内容在不同的平台上是不同的。使用带有平台后缀的源文件,例如 foo_linux.go 和 foo_windows.go。 go build 只会编译具有匹配后缀的文件。这是一种很好且干净的方式来分解依赖于平台的代码。
猜你喜欢
  • 2015-01-25
  • 1970-01-01
  • 2010-09-21
  • 2012-10-04
  • 2015-09-24
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多