Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 戈朗:如何在Linux上使用syscall.syscall?_Go_System Calls - Fatal编程技术网

Go 戈朗:如何在Linux上使用syscall.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中捕获系统调用的结果

关于在Windows()上加载共享库并使用syscall包调用函数,有一个非常好的描述。但是,本说明中使用的函数
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)
}