POSIX 共享内存写入/读取

Posted

技术标签:

【中文标题】POSIX 共享内存写入/读取【英文标题】:POSIX Shared Memory writing/reading 【发布时间】:2013-09-29 01:22:50 【问题描述】:

我正在阅读这本教科书的 POSIX 共享内存部分。在我进行一些更改之前,我无法从书中获取代码进行编译。我了解共享内存的概念以及如何打开它,但我仍然对读/写感到困惑。教科书代码显示了一个 hello world 字符串示例,但我不确定如何将其应用于整数、数组、结构等。这是我正在使用的教科书代码。这是写的。

const int SIZE = 4096;
const char *name = "OS";
const char *message_0 = "Hello";
const char *message_1 = "World!";

int shm_fd;
void *ptr;

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);

//sprintf(ptr, "%s", message_0); //non working text book code
sprintf((char*)ptr, "%s", message_0); //my change to get it to work
ptr += strlen(message_0);
//sprintf(ptr, "%s", message_1);
sprintf((char*)ptr, "%s", message_1);
ptr += strlen(message_1);

这是阅读。

    const int SIZE = 4096;
    const char *name = "OS";
    int shm_fd;
    void *ptr;

    shm_fd = shm_open(name, O_RDONLY, 0666);
    ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);

    printf("%s", (char*)ptr);
    shm_unlink(name);

我尝试将其更改为写入/读取整数,但我无法让它工作。我的印象是我应该能够为 ints 做一些事情,比如:

*ptr = 2;
ptr++;

但是,我无法做到这一点,或者我尝试过的任何其他工作方式。谁能更好地解释一下?谢谢。

【问题讨论】:

【参考方案1】:

您可以将 mmap 结果转换为 int* 或 double* 或任何您喜欢的形式。您可以做的一件事是将结构覆盖到共享内存上:

struct MyStruct

    int s_int;
    char s_str[64];
;

void* mem = mmap ...
struct MyStruct* sp = (struct MyStruct*)mem;

/* writing */
sp->s_int = 3;
strcpy(sp->s_str, "Hello");

/* reading */
printf("s_int=%d, s_str=%s\n", sp->s_int, sp->s_str);

【讨论】:

感谢您为我解决这个问题。这正是我所需要的。

以上是关于POSIX 共享内存写入/读取的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

内存写入性能 - GPU CPU 共享内存

在 c++ 程序中有效使用 POSIX 共享内存

linux进程间通信之System V共享内存详解及代码示例

linux 共享内存 可不可以不加锁呢? 系统有两个进程,一个负责写入,一个负责读取

Posix共享内存