基本上,我正在尝试用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()
}
有什么建议吗?我没有尝试任何事情,我完全没有想法。
答案 0 :(得分: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))
}