假设我有一个缓冲区:
int * buffer;
并且此缓冲区与多个进程(共享内存)共享。
如果我想从/向该缓冲区读/写我该怎么做?
我问这个是因为我找到了很多信息和各种不同的方法来解决这个问题,但答案缺乏组织,变得非常混乱和难以理解。
这是我用来创建共享内存段的函数:
void * create_shared_memory(char *name, int size) {
int *ptr;
int ret;
int fd = shm_open (name, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror ("shm_open error!");
exit (1);
}
ret = ftruncate (fd, sizeof (size));
if (ret == -1) {
perror ("ftruncate error!");
exit (2);
}
ptr = mmap(0, sizeof (size), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror ("shm-mmap error!");
exit (3);
}
return ptr;
}
答案 0 :(得分:2)
创建并映射共享内存段,从而获得指向它的指针,您可以通过该指针读取或写入它。就语法和机制而言,这与任何其他内存相同。你可以用任何你喜欢的方式包装函数,但你本身并不需要这样做。
然而,正如EOF所观察到的,共享内存语义比非共享内存语义复杂得多。您需要在共享内存访问周围使用适当的同步帮助,以确保线程和/或进程正确协作,否则结果是未定义的。