1

基本上,我试图用 Go 函数替换 C 程序中的 pread 。我的大部分结构都在工作,但我不知道如何用所需的字节填充缓冲区参数(buf unsafe.Pointer)。

daemon.c 的一部分:

static int preadShim(int fd, void *buf, size_t count, off_t offset) {
    //return pread(fd, buf, count, offset);
    return ReadOver(fd, buf, count, offset);
}

在 Golang 文件中:

package main

import "C"
import "fmt"
import "unsafe"

//export ReadOver
func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int{
    fmt.Println("ReadOver got called")  
    newBuf := []byte("injected bytes")
    //TODO: copy newBuf over buf
    return count
}

另一个 Golang 文件:

package main

// #include "daemon.c"
import "C"
import "fmt"

func main() {
    //Start C program
    C.start()
}

有什么建议么?我什么都没试过,我完全没有想法。

4

1 回答 1

2

您只需要从中创建自己的切片,例如:

func ReadOver(fd C.int, buf unsafe.Pointer, count C.int, offset C.int) C.int {
    fmt.Println("ReadOver got called")
    newBuf := []byte("injected bytes")
    slice := &reflect.SliceHeader{Data: uintptr(buf), Len: int(count), Cap: int(count)}
    rbuf := *(*[]byte)(unsafe.Pointer(slice))
    return C.int(copy(rbuf, newBuf))
}
于 2014-09-10T22:23:22.780 回答