我在程序A中使用以下代码创建共享内存:
shm = shm_open("/mfs_hash_pool_container", O_CREAT|O_RDWR, 0666);
size = sizeof(struct mfs_hash_pool_container);
ftruncate(shm, size);
mfs_hash_pool_stat_p = (struct mfs_hash_pool_container *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm, 0);
我用它来存储哈希表。
另一个程序B将从程序A接收addr(mfs_hash_pool_stat_p + offset)发送,但我无法在B中写入。 这是否意味着我还必须在B中打开这个共享内存?有没有其他方法可以解决这个问题?因为我自动创建了这个内存。
谢谢你们。
答案 0 :(得分:7)
您不能在其他程序中使用该地址。 B必须:
shm_open("/mfs_hash_pool_container", O_RDWR, 0)
mmap
就像A做注意:
mmap
的返回值(它可以返回MAP_FAILED
)mmap
答案 1 :(得分:1)
单独的进程不共享内存,因此从A传递给B的地址不会指向共享内存段。每个进程必须单独调用shm_open()和mmap()段。
如果您有关于每个流程需要注意的细分的信息,请按照每个流程都知道的顺序将其打包到细分的开头。
答案 2 :(得分:0)
我不确定你的程序A和程序B是如何相关的,但如果你设法使用fork()
+ execve()
组合从'A'产生'B',那么你不需要担心传递内存指针,因为两个进程都有相同的副本。
为了您的参考,我在IBM developerworks这里粘贴了一个很好的代码示例 -
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
void error_and_die(const char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[])
{
int r;
const char *memname = "sample";
const size_t region_size = sysconf(_SC_PAGE_SIZE);
int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd == -1)
error_and_die("shm_open");
r = ftruncate(fd, region_size);
if (r != 0)
error_and_die("ftruncate");
void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd);
pid_t pid = fork();
if (pid == 0)
{
u_long *d = (u_long *)ptr;
*d = 0xdbeebee;
exit(0);
}
else
{
int status;
waitpid(pid, &status, 0);
printf("child wrote %#lx\n", *(u_long *)ptr);
}
r = munmap(ptr, region_size);
if (r != 0)
error_and_die("munmap");
r = shm_unlink(memname);
if (r != 0)
error_and_die("shm_unlink");
return 0;
}
阅读上述链接中的完整文章,以便更好地了解共享内存!
答案 3 :(得分:-2)
默认情况下,进程不共享内存。如果您希望这2个进程进行通信或共享内存,则必须实现这一点。 Check this question.
另一种解决方案是使用线程,它们共享代码和内存。