繁体   English   中英

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

[英]Shared Memory on Linux without ftruncate & physical files?

当我想在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上时,它只是困扰我一点点我必须这样做。

您可以使用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个字节来填充文件。

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

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

如果这不起作用那么shm_open是你最好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM