英文:
What is wrong with this mmap system call?
问题
这是一个尝试使用mmap
映射文件并写入一个字节的示例代码:
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
file, _ := os.Open("/tmp/data")
mmap, _ := syscall.Mmap(int(file.Fd()), 0, 100, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
fmt.Printf("cap is %d", cap(mmap))
mmap[0] = 0
syscall.Munmap(mmap)
}
尽管长度设置为100,但mmap
的容量始终为0。系统调用出了什么问题?
英文:
This is an attempt to mmap
a file and write a single byte:
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
file, _ := os.Open("/tmp/data")
mmap, _ := syscall.Mmap(int(file.Fd()), 0, 100, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
fmt.Printf("cap is %d", cap(mmap))
mmap[0] = 0
syscall.Munmap(mmap)
}
Despite length is set to 100, mmap
capacity is always 0. What went wrong in the system call?
答案1
得分: 10
始终检查错误!
os.Open
仅打开文件以供读取,但mmap
调用要求将文件映射为读/写,因此会导致权限被拒绝的错误,并且映射的区域大小为0。
英文:
Always check for error!
os.Open
opens a file for reading only, however mmap
call asks to map the file read/write, thus giving a permission denied error, and as a result mapped region size is 0.
答案2
得分: -1
文件/tmp/data
是否为空?如果是的话:
我认为你不能将任意的length
参数(比如你的情况下的100)传递给Mmap
。我认为这个参数必须小于等于file.Size()
,即由fd引用的文件的大小。如果是这种情况,那么尝试将你的数据文件变为非空,然后再试一次。
英文:
Is the file /tmp/data
empty? If so:
I think you cannot pass arbitrary length
parameter (like 100 in your case) to Mmap
. I think this parameter must be <= file.Size()
, ie the the size of the file referred to by fd. If that's the case then try to make your data file non-empty and try again.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论