ファイル記述子(をサポートする)を「偽造」する必要があり、fstat
このようにします。
func ScanBytes(b []byte) error {
size := C.size_t(len(b))
path := C.CString("/bytes")
fd := C.shm_open(path, C.O_RDWR|C.O_CREAT, C.mode_t(0600))
defer C.shm_unlink(path)
defer C.close(fd)
res := C.ftruncate(fd, C.__off_t(size))
if res != 0 {
return fmt.Errorf("could not allocate shared memory region (%d)", res)
}
var addr = unsafe.Pointer(&b[0])
C.mmap(addr, size, C.PROT_READ|C.PROT_WRITE, C.MAP_SHARED|C.MAP_FIXED, fd, 0)
defer C.munmap(addr, size)
// _, err := syscall.Write(int(fd), b)
return doSomethingWith(fd)
}
ファイル ハンドルへの書き込みがコメント アウトされている場所がわかります。
割り当てられた領域にバッファーを書き込まないと、空になります。mmap
と組み合わせてMAP_FIXED
、提供されたバッファーのアドレスを使用して、コンテンツをその領域にマッピングすることを望んでいました。
write
呼び出しがコピーされるため、メモリ使用量が2倍になると思います。私は本当にしなければならないのwrite
ですか?