Golang: How to use syscall.Syscall on Linux?
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/
Related videos on Youtube
Michael
Updated on September 14, 2022Comments
-
Michael over 1 year
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
andGetProcAddress
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
-
JimB over 8 yearsThe "official" (and highly recommended) way to do this is to use cgo. Windows has these in the syscall package, because windows requires loading DLLs for some functionality. Linux doesn't need to load shared libraries for any syscalls, so there's no built-in support.
-
kostix over 8 yearsI suggest looking in the source of the
syscall.go
and*syscall_linux[_$GOARCH].go
files of the Go runtime. Thegolang.org/x/sys
package might of of interest, too.
-
-
Ilya Vishnevsky over 5 yearsIn
syscall
package all available constants have already defined ( golang.org/pkg/syscall/#pkg-constants ) So, for @ErikBye example,39
can be replaced bysyscall.SYS_GETPID
-
sbrk over 5 yearsGreat! Not sure if they were defined at the time I wrote the answer.