【问题标题】:Determine how many times file is mapped into memory确定文件映射到内存的次数
【发布时间】:2014-08-24 03:09:58
【问题描述】:

是否可以在 Linux 中获取特定文件描述符上的内存映射总量?为了清楚起见,我制作了一个如何打开/创建内存映射的小示例代码:

int fileDescriptor = open(mapname, O_RDWR | O_CREAT | O_EXCL, 0666);
if(fileDescriptor < 0)
    return false;

//Map Semaphore
memorymap = mmap(NULL, sizeof(mapObject), PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
close(fileDescriptor); 

内存映射被多个进程使用。我可以访问将使用此内存映射的其他进程的代码库。如何以 100% 正确的方式获取 fileDescriptor 上有多少张地图?

【问题讨论】:

  • 只有你的进程会打开文件吗?
  • @Ben 有多个进程将使用该文件。
  • 所有进程都归你所有吗?如您是否可以选择编辑访问文件的任何内容的代码?
  • @Ben 所有这些过程都归我所有。我可以完全访问将要使用它的所有程序的代码。
  • 我想我得到的是你能做一个简短的应用程序,接受来自每个访问文件的应用程序的套接字连接。然后当他们访问它时,他们会连接这个“其他”程序来计算它的连接?

标签: c++ linux shared-memory


【解决方案1】:

您可以检查所有/proc/*/maps文件并计算内存映射文件被提及的次数。

例如,这就是内存映射“/tmp/delme”的提及方式

7fdb737d0000-7fdb737d1000 rw-s 00000000 08:04 13893648                   /tmp/delme
7fdb737d8000-7fdb737d9000 rw-s 00000000 08:04 13893648                   /tmp/delme

使用以下代码时:

// g++ -std=c++11 delme.cc && ./a.out
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fstream>
#include <iostream>

int main() {
  int fileDescriptor = open("/tmp/delme", O_RDWR, 0664);
  if (fileDescriptor < 0) return false;
  auto memorymap = mmap (NULL, 123, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
  auto memorymap2 = mmap (NULL, 123, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
  close (fileDescriptor);
  std::ifstream mappings ("/proc/self/maps");
  std::cout << mappings.rdbuf() << std::endl;
}

另见Understanding Linux /proc/id/maps。

如果您发出全局锁,防止在计数发生时发生任何映射和取消映射,那么此计数器将 100% 正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2011-05-26
    • 2016-02-23
    • 1970-01-01
    • 2014-11-29
    • 2018-05-18
    相关资源
    最近更新 更多