1.共享内存
进程间通信的一种方式,多个进程共享一段内存,“共享内存”。
实现方式:
在内核中开辟一块空间,其它的进程通过 “映射”的方式
获取这段共享内存的引用(指针)进程 P1 可以映射这段内存,同时其它进程 p2也可以映射
这段内存, P1往这段内存中写数据,实际上就是往p2的进程
地址空间写数据,反之亦然。
类似于文件操作。
2.System V 共享内存 API函数
1.ftok 创建一个key
#include <sys/types.h>
#include <sys/ipc.h>
函数:
key_t ftok(const char *pathname, int proj_id);
pathname : 一个文件系统中存在的路径名(要存在的)"/home/china/" ....
proj_id : 整数, 一般用工程的代号。
返回值:
成功生成一个唯一的 System V ipc的key (key_t)
失败返回-1,同时errno被设置。
2.创建或者打开System V 共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
函数:
int shmget(key_t key, size_t size, int shmflg);
key: System V IPC对象的key ,一般由ftok的返回值
size : 以字节为单位指定共享内存的大小。当实际操作为创建一个新的共享内存区时,必须指定一个不为0的size的值(PAGE_SIZE 4k 的整数倍)。如果实际操作访问一个已经打开的共享内存,那么size应为0.
shmflg:标志位
(1) 创建 :IPC_CREAT | 权限位
(2) 打开 0
返回值:
成功返回共享内存区的id,这个id就唯一标识这个共享内存。
失败返回-1,同时errno被设置。
3.映射 / 解映射
shmat / shmdt
#include <sys/types.h>
#include <sys/shm.h>
shmat: 用来映射一段System V 共享内存的
函数:
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid: 要映射的共享内存的id(shmget的返回值)
shmaddr: 指向您要映射到进程的哪个地址中去一般为NULL,表示让系统自动分配地址。
shmflg:
(1) SHM_RDONLY 只读
(2) 0 读写
返回值 :
成功返回映射后的首地址
失败返回NULL,同时errno被设置
---------------------------------------------------------------------
shmdt: 用来解映射一段System V 共享内存的
int shmdt(const void *shmaddr);
shmaddr:您要释放的空间地址(一般shmat的返回值)
返回值:
成功返回0
失败返回-1,同时errno被设置。
4.删除
函数
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid: 要控制操作命令的共享内存的id
cmd : 操作命令,不同的命令第三个参数不一样
IPC_RMID , 删除指定的共享内存
buf: 如果cmd == IPC_RMID ,buf就为NULL
返回值:
成功返回0
失败返回-1,同时errno被设置。