Golang: как использовать syscall.Syscall на Linux?

существует очень хорошее описание загрузки общей библиотеки и вызова функции с пакетом syscall в Windows (https://github.com/golang/go/wiki/WindowsDLLs). Однако функции LoadLibrary и GetProcAddress, которые используются в этом описании, недоступны в пакете syscall в Linux. Я не смог найти документацию о том, как это сделать в Linux (или Mac OS).

Спасибо за помощь

1 ответов


Linux syscalls используются непосредственно без загрузки библиотеки, как именно зависит от того, какой системный вызов вы хотели бы выполнить. Вы должны обратиться к ссылке const системных вызовов в https://golang.org/pkg/syscall/

Я буду использовать Linux системный вызов getpid() в качестве примера, который возвращает идентификатор вызывающего процесса (процесс, в данном случае).

согласно нашей ссылке (ссылка выше), в Go этот syscall имеет значение uintptr 39, и он указан как SYS_GETPID. В вашем коде вы можете определить const, например sysGetPid, со значением 39.

package main

import (
    "fmt"
    "syscall"
)

func main() {
    pid, _, _ := syscall.Syscall(39, 0, 0, 0)
    fmt.Println("process id: ", pid)
}

я фиксирую результат syscall в pid, этот конкретный вызов не возвращает ошибок, поэтому я использую пустые идентификаторы для остальных возвращений. Syscall возвращает два uintptr и 1 ошибку.

Как вы можете видеть, я также могу просто передать 0 для остальных аргументов функции, так как мне не нужно передавать аргументы в этот syscall.

функции подпись: функции системного вызова(ловушка uintptr, uintptr nargs, uintptr А1, uintptr А2, А3 uintptr) (Р1 uintptr, uintptr Р2, подстраховаться для errno)

для других syscalls вы должны обратиться к ссылке системного вызова для Linux, например http://man7.org/linux/man-pages/man2/syscalls.2.html, чтобы узнать, какие аргументы вам нужно передать, и что он возвращает.