#linux #go #cgo #ld-preload
#linux #Вперед #cgo #ld-предварительная загрузка
Вопрос:
Я пытаюсь подключить системный вызов fork в Linux с помощью Go.
package main
/*
#include <unistd.h>
*/
import "C"
import (
"fmt"
"os"
"github.com/rainycape/dl"
)
func main() {}
//export fork
func fork() C.pid_t {
lib, err := dl.Open("libc", 0)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer lib.Close()
var old_fork func() C.pid_t
lib.Sym("fork", amp;old_fork)
return old_fork()
}
Когда я компилирую и запускаю as LD_PRELOAD
, возникает паника
panic: reflect.MakeFunc: value of type `int32` is not assignable to type main._Ctype_int
Комментарии:
1. Похоже, этот
dl
пакет хочет, чтобы вы использовали typeint
для возвращаемого типаfork
, а неC.pid_t
. (Тем не менее, вставлять хук передfork
будет проблематично.)2. Вы не можете разветвлять процесс с помощью среды выполнения Go, поэтому использование Go to hook
fork
не будет работать правильно.
Ответ №1:
Вы должны установить некоторые директивы для его запуска. Пожалуйста, взгляните на его официальную документацию. использование cgo — официальный документ Golang