gpt4 book ai didi

c - 如何与 shm_open 共享现有内存?

转载 作者:IT王子 更新时间:2023-10-29 00:22:07 25 4
gpt4 key购买 nike

在 Linux 中,我想与其他进程共享我的进程的一些内存内容。其中一种方法是使用 shm_open 和 mmap。如下所示。

/* Create a new memory object */
fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 );
if( fd == -1 ) {
fprintf( stderr, "Open failed:%s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

/* Set the memory object's size */
if( ftruncate( fd, sizeof( *addr ) ) == -1 ) {
fprintf( stderr, "ftruncate: %s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

/* Map the memory object */
addr = mmap( 0, sizeof( *addr ),
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0 );
if( addr == MAP_FAILED ) {
fprintf( stderr, "mmap failed: %s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

但是,这样一来,我就无法共享“已经分配的内存”了。我的问题是:我可以共享以前分配的内存内容而不重新分配它们吗?

提前致谢。

最佳答案

您的代码确实共享内存,但您的两个进程将获得不同的地址区域。您希望拥有相同的区域,因此 addr 值将相同。在这种情况下,您可以在此内存中构建对象,使用内部指针,并且您的对象在两个进程中都是有效和可见的。

有两种方法可以做到这一点。

1) 执行 fork() 以创建另一个进程

2) 使用MAP_FIXED 要求mmap 在特殊地址分配内存.

对于第二个,您的代码将如下所示:

/* Create a new memory object */
fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 );
if( fd == -1 ) {
fprintf( stderr, "Open failed:%s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

/* Set the memory object's size */
if( ftruncate( fd, sizeof( *addr ) ) == -1 ) {
fprintf( stderr, "ftruncate: %s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

// You base address for memory region that you want to share.
// Choose this carefully, you both processes MUST have it available!
void * baseAddr = 0x7fff00000000;

/* Map the memory object */
addr = mmap( baseAddr, sizeof( *addr ),
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED, fd, 0 );

if( addr == MAP_FAILED | MAP_FIXED ) {
fprintf( stderr, "mmap failed: %s\n",
strerror( errno ) );
return EXIT_FAILURE;
}

image

关于c - 如何与 shm_open 共享现有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21847865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com