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, чтобы узнать, какие аргументы вам нужно передать, и что он возвращает.