Golang: How to use syscall.Syscall on Linux?

13,258

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/

Share:
13,258

Related videos on Youtube

Michael
Author by

Michael

Updated on September 14, 2022

Comments

  • Michael
    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 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

    • JimB
      JimB over 8 years
      The "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
      kostix over 8 years
      I suggest looking in the source of the syscall.go and *syscall_linux[_$GOARCH].go files of the Go runtime. The golang.org/x/sys package might of of interest, too.
  • Ilya Vishnevsky
    Ilya Vishnevsky over 5 years
    In syscall package all available constants have already defined ( golang.org/pkg/syscall/#pkg-constants ) So, for @ErikBye example, 39 can be replaced by syscall.SYS_GETPID
  • sbrk
    sbrk over 5 years
    Great! Not sure if they were defined at the time I wrote the answer.