英文:
Golang: How to use syscall.Syscall on Linux?
问题
这里有一个非常好的关于在Windows上使用syscall包加载共享库并调用函数的描述(https://github.com/golang/go/wiki/WindowsDLLs)。然而,在Linux上的syscall包中并没有提供在该描述中使用的LoadLibrary
和GetProcAddress
函数。我找不到关于如何在Linux(或Mac OS)上实现这一功能的文档。
谢谢帮助。
英文:
There is a very nice description about loading a shared library and calling a function with the syscall package on Windows (https://github.com/golang/go/wiki/WindowsDLLs). However, the functions LoadLibrary
and GetProcAddress
that are used in this description are not available in the syscall package on Linux. I could not find documentation about how to do this on Linux (or Mac OS).
Thanks for help
答案1
得分: 9
Linux系统调用可以直接使用,而无需加载库,具体取决于您想执行的系统调用。
我将以使用Linux系统调用getpid()为例,该调用返回调用进程(在本例中为我们的进程)的进程ID。
package main
import (
"fmt"
"syscall"
)
func main() {
pid, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0)
fmt.Println("进程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/。
英文:
Linux syscalls are used directly without loading a library, exactly how depends on which system call you would like to perform.
I will use the Linux syscall getpid() as an example, which returns the process ID of the calling process (our process, in this case).
package main
import (
"fmt"
"syscall"
)
func main() {
pid, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0)
fmt.Println("process id: ", pid)
}
I capture the result of the syscall in pid, this particular call returns no errors so I use blank identifiers for the rest of the returns. Syscall returns two uintptr and 1 error.
As you can see I can also just pass in 0 for the rest of the function arguments, as I don't need to pass arguments to this syscall.
The function signature is: func Syscall(trap uintptr, nargs uintptr, a1 uintptr, a2 uintptr, a3 uintptr) (r1 uintptr, r2 uintptr, err Errno).
For more information refer to https://golang.org/pkg/syscall/
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论