c++ 共享内存

共享内存

一、查看所有的共享内存

(py37) hq@nuc:~/tmp/hq$ ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 4          blueberry  600        524288     2          dest
0x00000000 9          blueberry  600        524288     2          dest
0x00000000 14         blueberry  600        16777216   2          dest
0x44005658 22         blueberry  666        12         1
0x00000000 23         blueberry  600        299008     2          dest
0x00000000 24         blueberry  600        299008     2          dest
0x00000000 25         blueberry  606        7165584    2          dest
0x00000000 26         blueberry  606        7165584    2          dest
0x00000000 32804      blueberry  600        524288     2          dest
0x00000000 32807      blueberry  600        4194304    2          dest
  • key(键):共享内存段的标识符。它是共享内存的唯一标识,允许进程通过这个键来访问共享内存。

  • shmid(共享内存标识符):内核为共享内存段分配的唯一ID。

  • owner(所有者):拥有该共享内存段的用户ID。

  • perms(权限):共享内存段的权限。

  • bytes(字节数):共享内存段的大小,以字节为单位。

  • nattch(附加次数):附加到共享内存段的进程数。当进程附加(使用 shmat)或解除附加(使用 shmdt)时,此计数会相应增加或减少。

  • status(状态):共享内存段的状态信息,例如是否被附加,是否被删除等

二、创建共享内存

1、示例代码

include <iostream>
#include 
#include 

int main() {
    key_t key = ftok("/tmp", 'a'); // 生成一个键

    int shmid = shmget(key, 1024, IPC_CREAT | 0666); // 创建一个共享内存段
    if (shmid < 0) {
        perror("shmget");
        return 1;
    }

    char *str = (char*)shmat(shmid, nullptr, 0); // 连接到当前进程的地址空间
    if (str == (char*)(-1)) {
        perror("shmat");
        return 1;
    }

    std::cout << "Write data to shared memory: ";
    std::cin >> str; // 写入数据到共享内存

    shmdt(str); // 分离共享内存

    return 0;
}

2、查看共享内存情况ipcs -m

三、获取共享内存内容

#include 
#include 
#include 
#include 

int main() {
    int shmid = 32808;

    char *shmaddr = (char*) shmat(shmid, (void*)0, 0); // 连接共享内存

    printf("Data read from memory: %s\n", shmaddr); // 读取共享内存中的数据

    shmdt((void*)shmaddr); // 断开连接

    shmctl(shmid, IPC_RMID, NULL); // 删除共享内存段

    return 0;
}

四、特性

1、共享内存在什么时候被回收?

  • 通常在进程结束后,需要手动释放回收

  • 系统重新启动

2、共享内存大小

  • 整个系统可用的共享内存大小,cat /proc/sys/kernel/shmmax

  • 每个进程可以使用的共享内存大小,cat /proc/sys/kernel/shmall

  • 消息队列也受到资源限制,cat /proc/sys/kernel/msgmnb

你可能感兴趣的:(c++,开发语言,共享内存)