【问题标题】:Read a growing mmap file in Go在 Go 中读取一个不断增长的 mmap 文件
【发布时间】:2018-07-25 20:09:28
【问题描述】:

我想在 golang 中读取 mmap 文件。

另一个进程正在向其中写入内容,因此它的大小在读取时会增长。

我正在使用

syscall.Mmap(fd int, offset int64, length int, prot int, flags int)

这将返回一个字节数组。

我需要继续syscall.Mmap 来阅读更新的 mmap 吗?有更好的方法吗?

【问题讨论】:

  • 另一个进程正在写入你进程的虚拟内存?这通常是不可能的。我认为您误解了 mmap 系统调用的作用。
  • @MarcoBonelli: MAP_SHARED 允许在进程之间共享。来自mmap 手册页:Updates to the mapping are visible to other processes mapping the same region
  • @JimB 哦,那是我的错,不知道MAP_SHARED,谢谢你的信息。

标签: go system-calls mmap


【解决方案1】:

syscall.Mmap() 只是 C mmap(2) 上的一个薄包装器,因此它的行为相同。如果您使用了syscall.MAP_SHARED 标志(并且其他进程也这样做了),那么您返回的内存区域可以由其他进程更新。除了记得在完成后致电syscall.Munmap() 外,您无需执行任何其他操作。这可能是defering 的一个很好的候选,这取决于你在做什么。

但是,如果有人正在向共享空间写入数据并将其扩展到您映射的区域之外,那么您将不得不再次对其进行映射。它不会自动调整大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多