首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >POSIX共享内存读写

POSIX共享内存读写
EN

Stack Overflow用户
提问于 2013-09-29 01:22:50
回答 1查看 3.2K关注 0票数 1

我正在阅读这本教科书的POSIX共享内存部分。除非我做了一些修改,否则我无法从书中得到代码来编译。我理解共享内存的概念以及如何打开它,但我仍然对读/写感到困惑。教科书代码显示了一个hello world字符串示例,但我不知道如何将它应用到it、数组、结构等。下面是我正在使用的教科书代码。这是写的。

代码语言:javascript
运行
复制
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);

这是读出来的。

代码语言:javascript
运行
复制
    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);

我试着把它修改为写/读it,但是我无法让它工作。我当时的印象是,我应该能够为非政府组织做一些事情,例如:

代码语言:javascript
运行
复制
*ptr = 2;
ptr++;

但是,我不明白,或者任何其他我试着工作的方式。有人能解释得更好吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-29 14:38:40

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

代码语言:javascript
运行
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19073488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档