共享内存
共享内存是进程间通信效率最高的一种通信机制
首先我们要了解一个词–key
key就等于是一把钥匙,而共享内存就等于是一个共享的房间,但这个房间也不是什么人都可以进得去,得有钥匙,所以我们来看看key值得获取:
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
参数:
pathname:任意路径
proj_id:任意字符,因为它读取得是低8位,所以我们可以随便取个字符,
让其和系统组合生成一把钥匙。
eg:'a'、'i'、'?'。。。都行。
返回值:
成功返回key值,失败返回-1;
共享内存的相关流程:
1、创建或者打开共享内存–shmget()
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
参数:
key:通过ftok得到的key值或者使用IPC_PRIVATE(创建私有共享内存)
size:共享内存的大小
shmflg:创建共享内存权限,一般填0664|IPC_CREAT-->有就打开,没有就创建
返回值:
成功返回共享内存ID,失败返回-1
2、映射共享内存–shmat()
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid:共享内存ID
shmaddr:映射地址,填NULL表示系统自动分配
shmflg:SHM_RDONLY -- 只读
0 -- 读写
返回值:
成功返回映射地址,失败返回(void *)-1;
3、共享内存访问---->输入/输出/其他
4、取消映射–shmdt()
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
参数:
shmadr:要取消映射的地址
返回值: 成功返回0,失败返回-1
5、删除共享内存–shmctl()
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd,struct shmid_ds *buf);
参数:
shmid:共享内存id号
cmd:操作共享内存的命令:
IPC_STAT:获取共享内存信号,需要用到第三个参数
struct shmid_ds { // ipc_stat 所用到的一些结构体成员,
struct ipc_perm shm_perm; /* Ownership and permissions */
size_t shm_segsz; /* Size of segment (bytes) */
time_t shm_atime; /* Last attach time */
time_t shm_dtime; /* Last detach time */
time_t shm_ctime; /* Last change time */
pid_t shm_cpid; /* PID of creator */
pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */
shmatt_t shm_nattch; /* No. of current attaches */
};
IPC_SET:设置共享内存信息
IPC_RMID:删除共享内存,第三个参数填NULL
返回值:
成功返回0,失败返回-1
相关结构体成员含义:
6、实例
两个进程文件,一个进程向共享内存输入数据,一个进程从共享内存输出数据
代码演示:
输入端
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include