Go 戈朗:如何在Linux上使用syscall.syscall?
关于在Windows()上加载共享库并使用syscall包调用函数,有一个非常好的描述。但是,本说明中使用的函数Go 戈朗:如何在Linux上使用syscall.syscall?,go,system-calls,Go,System Calls,关于在Windows()上加载共享库并使用syscall包调用函数,有一个非常好的描述。但是,本说明中使用的函数LoadLibrary和GetProcAddress在Linux上的syscall包中不可用。我找不到关于如何在Linux(或Mac OS)上执行此操作的文档 感谢您的帮助Linux系统调用无需加载库即可直接使用,具体使用方式取决于您希望执行的系统调用 我将以Linux syscall getpid()为例,它返回调用进程(本例中是我们的进程)的进程ID 我在pid中捕获系统调用的结果
LoadLibrary
和GetProcAddress
在Linux上的syscall包中不可用。我找不到关于如何在Linux(或Mac OS)上执行此操作的文档
感谢您的帮助Linux系统调用无需加载库即可直接使用,具体使用方式取决于您希望执行的系统调用 我将以Linux syscall getpid()为例,它返回调用进程(本例中是我们的进程)的进程ID 我在pid中捕获系统调用的结果,这个特定调用不返回错误,因此我对其余的返回使用空标识符。Syscall返回两个uintptr和一个错误 正如您所看到的,我也可以为其余的函数参数传入0,因为我不需要向这个系统调用传递参数 函数签名是:func Syscall(trap uintpttr、nargs uintpttr、a1 uintpttr、a2 uintpttr、a3 uintpttr)(r1 uintpttr、r2 uintpttr、err Errno)
有关更多信息,请参阅您可能会发现此软件包很有用:@TimCooper请注意,“gopkgs.com”是不可访问的,并且是不可访问的。因此,可以安全地假设站点已经死了。@MarkusWMahlberg:go-get-u github.com/rainycape/dl仍然可以抓取包。“官方”(强烈推荐)方法是使用cgo。Windows在syscall包中有这些,因为Windows需要为某些功能加载DLL。Linux不需要为任何系统调用加载共享库,因此没有内置支持。我建议查找go运行时的
syscall.go
和*syscall\u Linux[\u$GOARCH].go
文件的源代码。这个包可能也很有趣。在syscall
包中,所有可用的常量都已定义(),因此,对于@ErikBye示例,39
可以替换为syscall.SYS\u GETPID
太棒了!我不确定在我写答案的时候它们是否被定义了。
package main
import (
"fmt"
"syscall"
)
func main() {
pid, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0)
fmt.Println("process id: ", pid)
}