Linux 上的 Golang : How to use syscall. 系统调用?

标签 go system-calls

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

感谢帮助

最佳答案

直接使用 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)
}

我在 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/

关于Linux 上的 Golang : How to use syscall. 系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34043323/

相关文章:

string - Go中不区分大小写的字符串替换

go - godoc本身的源代码在哪里?

c - 使用Linux C select系统调用来监视文件

go - 将DynamoDBAttributeValues解码为具有不同属性的结构

go - 如何在不更改 channel 的情况下打印 channel 内容

c - clock_gettime系统调用的clk_id有什么区别

linux - ARM 汇编时间系统调用意外值

c - 将一个子进程管道化为另一个子进程

c - 使用 c 进行系统调用

templates - 如何用两组数据修复golang嵌套模板