Golang:如何在Linux上使用syscall.Syscall?

Mic*_*ael 8 system-calls go

有关加载共享库和使用Windows上的syscall包调用函数的非常好的描述(https://github.com/golang/go/wiki/WindowsDLLs).然而,功能LoadLibraryGetProcAddress那些在本说明中使用未在系统调用封装在Linux上使用.我找不到关于如何在Linux(或Mac OS)上执行此操作的文档.

感谢帮助

sbr*_*brk 7

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

我将使用 Linux 系统调用 getpid() 作为示例,它返回调用进程(在本例中为我们的进程)的进程 ID。

package main

import (
    "fmt"
    "syscall"
)

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

我在 pid 中捕获了系统调用的结果,这个特定的调用没有返回任何错误,所以我对其余的返回使用空白标识符。系统调用返回两个 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`包中所有可用的常量都已经定义(https://golang.org/pkg/syscall/#pkg-constants)所以,对于@ErikBye例子,`39`可以替换为`syscall.SYS_GETPID` (3认同)