前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSIX之Shared Memory Object

POSIX之Shared Memory Object

作者头像
Taishan3721
发布2022-06-30 18:58:36
5510
发布2022-06-30 18:58:36
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

VxWorks支持POSIX的shared memory object - 通过shm_open()获得文件描述符,然后使用mmap()进行映射。shared和private方式都支持。

以Vx69为例,在VIP中包含组件INCLUDE_POSIX_SHM_API,VxWorks会创建一个名字为"/shm"的虚拟文件系统。这个文件系统,不支持常见的读写操作,只支持shm_open()和shm_unlink()

代码语言:javascript
复制
/* establishes a connection between a shared memory object and a file descriptor */
int shm_open(char *name, int oflag, mode_t mode);
/* remove a shared memory object */
int shm_unlink(char *name);

name的格式为"/shm/xxx"或者"/xxx"

oflag可用以下选项

代码语言:javascript
复制
O_RDONLY
O_RDWR
O_CREAT
O_EXCL  /* check for the existence of the object with O_CREAT */
O_TRUNC /* truncate the object to zero length with O_RDWR */

mode可用以下选项

代码语言:javascript
复制
S_IRUSR /* read permission, owner */
S_IWUSR /* write permission, owner */
S_IXUSR /* execute/search permission, owner */
S_IRWXU /* read/write/execute permission, owner */

S_IRGRP /* read permission, group */
S_IWGRP /* write permission, group */
S_IXGRP /* execute/search permission, group */
S_IRWXG /* read/write/execute permission, group */

S_IROTH /* read permission, other */
S_IWOTH /* write permission, other */
S_IXOTH /* execute/search permission, other */
S_IRWXO /* read/write/execute permission, other */

使用比较简单,直接跑个例子

代码语言:javascript
复制
#include <stdio.h>    /* printf() */
#include <unistd.h>   /* ftruncate() */
#include <fcntl.h>    /* O_CREAT */
#include <sys/stat.h> /* S_IRUSR */
#include <sys/mman.h> /* mmap() */

/*
 * Producer: fill object with some data.
 */
void testMemShmWrite()
{
    int  fd;
    int  ix;
    int *pData;
    
    /* 创建SHM */
    fd = shm_open("/myshm", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if(fd == -1)
        {
        printf("shm_open error\n");
        return;
        }

    /* 设置SHM长度 */
    if(ftruncate(fd, 0x1000) == -1)
        {
        printf("ftruncate error\n");
        close(fd);
        return;
        }

    /* 映射SHM到当前进程 */
    pData = (int *)mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    /* 关闭fd; 不影响映射 */
    close(fd);

    if(pData == (int *)MAP_FAILED)
        {
        return;
        }

    /* 修改SHM内容 */
    for(ix = 0; ix < 25; ix++)
        *(pData + ix) = ix;

    /* 取消映射 */
    munmap((void *)pData, 0x1000);
    }

/*
 * read object data.
 */
void testMemShmRead()
{
    int  fd;
    int  ix;
    int *pData;

    /* 创建SHM */
    fd = shm_open("/myshm", O_RDWR, S_IRUSR | S_IWUSR);
    if(fd == -1)
        {
        printf("shm_open error\n");
        return;
        }

    /* 映射SHM到当前进程 */
    pData = (int *)mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    /* 关闭fd; 不影响映射 */
    close(fd);

    if(pData == (int *)MAP_FAILED)
        {
        return;
        }

    /* 读取SHM内容 */
    for(ix = 0; ix < 25; ix++)
        printf("%d ", *(pData + ix));

    /* 从shmFs删除 */

    shm_unlink("/myshm");

    /* 取消映射 */
    munmap((void *)pData, 0x1000);
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档