использование cgo для подключения «вилки» системного вызова

#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 пакет хочет, чтобы вы использовали type int для возвращаемого типа fork , а не C.pid_t . (Тем не менее, вставлять хук перед fork будет проблематично.)

2. Вы не можете разветвлять процесс с помощью среды выполнения Go, поэтому использование Go to hook fork не будет работать правильно.

Ответ №1:

Вы должны установить некоторые директивы для его запуска. Пожалуйста, взгляните на его официальную документацию. использование cgo — официальный документ Golang