代码之家  ›  专栏  ›  技术社区  ›  Brandon

Linux上没有ftruncate和物理文件的共享内存?

  •  1
  • Brandon  · 技术社区  · 10 年前

    当我想在linux中映射一些共享内存时,我会:

    hFileMap = open(MapName, O_RDWR | O_CREAT, 438);
    
    pData = mmap(NULL, Size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, hFileMap, 0);
    

    而且效果很好。它正确映射内存。然而,出现了三件我不喜欢的事情。

    1. 它会在光盘上创建一个物理文件。我必须手动或使用 remove 作用我喜欢在Windows上没有物理文件,除非我自己物理映射文件。我想在linux上做同样的事情。

    2. 我必须使用 ftruncate 设置文件的长度。否则 memcpy 将数据复制到文件中时将出错。我的意思是,当我必须首先指定mmap的大小时,文件有0空间没有多大意义。。

    3. 大小是固定的。我不需要调整大小,因此不需要 ftruncate公司 ?

    在没有物理文件的情况下映射内存,并且其他进程仍然可以访问它吗?解决方案的缺点是什么?

    我真的不太在乎 ftruncate公司 但有没有办法也删除该呼叫?当我不必在Windows上时,我不得不这样做,这让我有点烦恼。

    2 回复  |  直到 10 年前
        1
  •  3
  •   Scott Wisniewski    10 年前

    shmopen仍将在文件系统中创建一个文件来表示共享内存对象。

    您可以使用map_anonymous和map_shared调用mmap,它不会创建任何文件。然而,其他进程必须是当前进程的子进程,并且必须在调用fork之前设置mmap。

    如果这行不通,那么shm_open是你最好的选择。

        2
  •  1
  •   Krypton    10 年前

    您可以使用shm_open创建共享内存区域。下面的代码段演示了使用shm_open()创建共享内存对象,然后使用ftruncate()调整大小,然后使用mmap()映射到进程地址空间:

    #include <unistd.h>
    #include <sys/mman.h>
    ...
    
    #define MAX_LEN 10000
    struct region {        /* Defines "structure" of shared memory */
        int len;
        char buf[MAX_LEN];
    };
    struct region *rptr;
    int fd;
    
    /* Create shared memory object and set its size */
    
    fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd == -1)
        /* Handle error */;
    
    
    if (ftruncate(fd, sizeof(struct region)) == -1)
        /* Handle error */;
    
    /* Map shared memory object */
    
    rptr = mmap(NULL, sizeof(struct region),
           PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (rptr == MAP_FAILED)
        /* Handle error */;
    
    /* Now we can refer to mapped region using fields of rptr;
       for example, rptr->len */
    ...
    

    ftruncate 设置文件大小。因此,如果您不想调用它,可以手动写入0字节来填充文件。