共享内存
一、查看所有的共享内存
(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 <sys/ipc.h>
#include <sys/shm.h>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 <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>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