英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论