key_t ftok(const char *pathname, int proj_id);
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
1.共享内存
共享是进程间通信的一种方式 多个进程共享一段内存
由于多个进程共享一段内存,这段内存既是你的,也是我的
我往这块内存中写数据 实际上就是往你的内存中写数据
比其他的IPC(pipe FIFO messages)s少了一个copy内存
的过程 共享内存的效率更高
"随内核持续性"
实现的方式
在内核中开辟一段共享内存 其他进程通过映射的方式
获取这段内存的引用 (指针)
进程p1可以映射这段内存 同时其他进程p2也可以映射这段内存
p1往这段内存中写数据 等效于往p2的进程空间中写数据 反之依然
System V 共享内存
POSIX 共享内存
2.System V共享内存 API函数
System V IPC(msg/shm/sem)操作流程
步骤: ftok
-----------> System V IPC对象的Key ----->创建或打开一个IPC的房间(msg/shm/sem)
-----> 将这个房间映射到相应的共享内存中去(对于shm) ---->关闭这个房间
如果把一个IPC(进程间通信 )设施(msg/shm/sem)比作内核中的一个房间
那么这个房间一定会有
一把唯一(只有这个key才能打开,但是key可以复制)的钥匙。
多个进程如果使用System V 进行 IPC (进程间通信 ),
那么数据就必须进入到同一个房间中去
key---> msg消息队列
shm共享内存
sem信号量
(1)ftok 用来创建一个system V IPC对象的Key
key最主要的特征是唯一性
NAME
ftok - convert a pathname and a project identifier to a System V IPC keySYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
const char *pathname: 一个文件系统的路径名(存在) 一般是工程下的某个路径
int proj_id: 整数 一般是工程的代号
返回值
成功生成一个唯一的 System v ipc的key(key_t)
失败返回-1 同时errno被设置
(2)创建或打开 System V共享内存
shmget
shmget - allocates a System V shared memory segmentSYNOPSIS
#include <sys/ipc.h>
#include <sys/shm.h>在内核中创建或打开一个System V 共享内存
int shmget(key_t key, size_t size, int shmflg);
key_t key: 填入 ftok获取的钥匙 System V 对象的key
size_t size: 以字节为单位指定共享内存的大小
当实际操作为创建一个共享内存的区域的时候
必须指定一个不为0的size(必须是Page的整数)
如果实际操作为访问一个已经存在的共享内存区时
那么size应为0
int shmflg:标志位
(1)创建 IPC_CREAT|权限位
(2)打开 0
返回值
成功返回共享内存区的id,这个id就唯一表示这个共享内存
失败返回-1 同时errno被设置
3.映射与解映射
映射的概念:把内核或设备或为念的一段内存映射到进程的地址空间中区
用一个进程的指针区操作这段内存
NAME
shmat, shmdt - System V shared memory operationsSYNOPSIS
#include <sys/types.h>
#include <sys/shm.h>
用来映射一段system V共享内存的
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmid : shm的返回值 共享内存区id
const void *shmaddr: 指向要映射到进程的那个地址上去
一般为NULL 让系统自行分配地址
int shmflg:
(1) SHM_RDONLY 只读
(2) 0 读写
成功 返回映射的首地址
失败 返回NULL 同时errno被设置
shmdt解映射一段System V共享内存
int shmdt(const void *shmaddr);
const void *shmaddr:要解除映射的那个地址
返回值
成功 返回0
失败 返回-1 同时errno被设置
4.其他操作 删除它
NAME
shmctl - System V shared memory controlSYNOPSIS
#include <sys/ipc.h>
#include <sys/shm.h>
这是一个共享内存的控制函数
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int shmid:要控制那个共享内存区 放这个共享的内存ID shmget的返回值
int cmd: 操作命令 不同的命令 第三个参数时不一样的
IPC_RMID 删除指定的内存区
struct shmid_ds *buf: 如果cmd == IPC_RMID buf为NULL
返回值
成功 返回0
失败 返回-1同时errno被设置