【问题标题】:Golang: How to use syscall.Syscall on Linux?Golang:如何在 Linux 上使用 syscall.Syscall?
【发布时间】:2016-03-06 17:29:15
【问题描述】:

关于加载共享库和在 Windows 上使用 syscall 包调用函数有一个很好的描述 (https://github.com/golang/go/wiki/WindowsDLLs)。但是,此描述中使用的函数LoadLibraryGetProcAddress 在Linux 的syscall 包中不可用。我找不到有关如何在 Linux(或 Mac OS)上执行此操作的文档。

感谢您的帮助

【问题讨论】:

  • 你可能会发现这个包很有用:github.com/rainycape/dl
  • @TimCooper 请注意,“gopkgs.com”无法访问,is an NXDOMAIN。因此可以安全地假设该站点已死。
  • @MarkusWMahlberg:仍然可以使用go get -u github.com/rainycape/dl 获取包。
  • “官方”(强烈推荐)的方法是使用 cgo。 Windows 在 syscall 包中有这些,因为 Windows 需要为某些功能加载 DLL。 Linux 不需要为任何系统调用加载共享库,因此没有内置支持。
  • 我建议查看 Go 运行时的 syscall.go*syscall_linux[_$GOARCH].go 文件的源代码。 golang.org/x/sys 包也可能很有趣。

标签: go system-calls


【解决方案1】:

Linux 系统调用直接使用而不加载库,具体如何取决于您要执行的系统调用。

我将以 Linux syscall getpid() 为例,它返回调用进程(本例中为我们的进程)的进程 ID。

package main

import (
    "fmt"
    "syscall"
)

func main() {
    pid, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0)
    fmt.Println("process id: ", pid)
}

我在 pid 中捕获了系统调用的结果,这个特定的调用没有返回错误,所以我使用空白标识符作为其余的返回值。 Syscall 返回两个 uintptr 和 1 个错误。

如您所见,我也可以为其余的函数参数传入 0,因为我不需要将参数传递给这个系统调用。

函数签名为:func Syscall(trap uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err Errno)。

更多信息请参考https://golang.org/pkg/syscall/

【讨论】:

  • syscall 包中已经定义了所有可用的常量(golang.org/pkg/syscall/#pkg-constants)因此,对于@ErikBye 示例,39 可以替换为syscall.SYS_GETPID
  • 太棒了!不确定它们是否在我写答案时被定义。
猜你喜欢
  • 2020-01-18
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多