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

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 字节,然后将其映射到进程地址空间。我们向共享内存中写入一段字符串并打印出来,最后取消映射并删除共享内存对象。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值