无法写入 C 中的共享内存缓冲区
Trouble writing into shared memory buffer in C
假设我有一个缓冲区:
int * buffer;
并且此缓冲区与多个进程共享(共享内存)。
如果我想read/write from/to那个缓冲区我会怎么做?
我问这个是因为我找到了很多信息和各种不同的方法来解决这个问题,但答案缺乏组织,变得非常混乱和难以理解。
这是我用来创建共享内存段的函数:
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;
}
创建并映射共享内存段,从而获得指向它的指针后,您可以通过该指针读取或写入它。就语法和机制而言,这与任何其他内存相同。您可以用任何您喜欢的方式围绕它包装函数,但您并不是天生就需要这样做。
然而,正如 EOF 所观察到的,共享内存 语义 比非共享内存语义复杂得多。您需要围绕共享内存访问使用适当的同步辅助工具,以确保线程 and/or 进程正确协作,否则结果不确定。
假设我有一个缓冲区:
int * buffer;
并且此缓冲区与多个进程共享(共享内存)。
如果我想read/write from/to那个缓冲区我会怎么做?
我问这个是因为我找到了很多信息和各种不同的方法来解决这个问题,但答案缺乏组织,变得非常混乱和难以理解。
这是我用来创建共享内存段的函数:
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;
}
创建并映射共享内存段,从而获得指向它的指针后,您可以通过该指针读取或写入它。就语法和机制而言,这与任何其他内存相同。您可以用任何您喜欢的方式围绕它包装函数,但您并不是天生就需要这样做。
然而,正如 EOF 所观察到的,共享内存 语义 比非共享内存语义复杂得多。您需要围绕共享内存访问使用适当的同步辅助工具,以确保线程 and/or 进程正确协作,否则结果不确定。