在 POSIX(可移植操作系统接口)系统中,共享内存通信shm_open

举报
yd_280361745 发表于 2024/08/06 16:59:07 2024/08/06
【摘要】 shm_open 是一个用于在 POSIX(可移植操作系统接口)系统中创建和打开共享内存对象的系统调用。共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一个内存段,从而实现数据的快速交换和同步。共享内存允许多个进程共享同一个内存段。shm_open(const char *name, int oflag, mode_t mode); 创建或打开一个共享内存对象mmap(void...

shm_open 是一个用于在 POSIX(可移植操作系统接口)系统中创建和打开共享内存对象的系统调用。共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一个内存段,从而实现数据的快速交换和同步。

共享内存允许多个进程共享同一个内存段

shm_open(const char *name, int oflag, mode_t mode);   创建或打开一个共享内存对象
mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);   映射共享内存对象到进程地址空间  
shm_unlink(const char *name);  删除共享内存对象 

以下是 shm_open 的基本使用步骤:

  1. 头文件: 使用 shm_open mmap shm_unlink 需要包含 <fcntl.h><sys/mman.h> 头文件。

  2. 函数原型:

    int shm_open(const char *name, int oflag, mode_t mode);
    
  3. 参数:

    • name: 共享内存对象的名称。这个名称应以斜杠(/)开头,如 "/my_shm"
    • oflag: 打开标志,可以是以下选项的组合:
      • O_RDONLY: 以只读方式打开。
      • O_RDWR: 以读写方式打开。
      • O_CREAT: 如果共享内存对象不存在,则创建它。
      • O_EXCL: 与 O_CREAT 一起使用,如果共享内存对象已存在,则调用失败。
      • O_TRUNC: 如果共享内存对象存在,将其长度截断为 0。
    • mode: 指定新创建的共享内存对象的权限位,如 0666 表示所有用户都有读写权限。
  4. 返回值:

    • 成功时返回一个文件描述符,用于后续的内存映射操作。
    • 失败时返回 -1,并设置 errno 以指示错误。
  5. 使用示例:

    #include <fcntl.h>
    #include <sys/mman.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        const char *name = "/my_shm";
        int shm_fd;
    
        // 创建并打开共享内存对象
        shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
        if (shm_fd == -1) {
            perror("shm_open");
            return 1;
        }
    
        // 设置共享内存对象的大小
        ftruncate(shm_fd, 4096);
    
        // 映射共享内存对象到进程地址空间
        void *ptr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
        if (ptr == MAP_FAILED) {
            perror("mmap");
            return 1;
        }
    
        // 使用共享内存
        sprintf(ptr, "Hello, World!");
        printf("%s\n", (char *)ptr);
    
        // 取消映射共享内存
        munmap(ptr, 4096);
    
        // 关闭文件描述符
        close(shm_fd);
    
        // 删除共享内存对象
        shm_unlink(name);
    
        return 0;
    }
    

在这个示例中,我们创建了一个名为 /my_shm 的共享内存对象,将其大小设置为 4096 字节,然后将其映射到进程地址空间。我们向共享内存中写入一段字符串并打印出来,最后取消映射并删除共享内存对象。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。