系列文章目录
目录
1.4 多功能函数,删除共享内存,设置,获取共享内存的属性信息
一、共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
ipcs -m // 查看共享内存
ipcrm -m 共享内存的ID号 // 删除共享内存
1 相关的接口函数
1.1 申请共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
返回值:成功返回申请得到的共享内存的ID号
失败 -1
参数1:key(重点) 表示键值,用来保证多个进程申请的内存区域是一致的
linux中有两种产生键值的方法:
(1) 程序员自己指定一个正整数作为键值
(2) 调用ftok()生成键值
//根据你传递的路径和整数ftok函数内部有一套算法,计算得到唯一的键值
key_t ftok(const char *pathname, int proj_id);
返回值:成功 返回一个键值
失败 -1
参数:pathname --》合法有效的linux路径
proj_id --》随便写个整数参数2:size:你要申请多大的内存区域,单位是字节 一般按照512字节的整数倍去申请
参数3:shmflg :PC_CREAT //O_CREAT
IPC_EXCL //O_EXCL O_TRUNC
0777
1.2 映射得到共享内存的首地址
void *shmat(int shmid, const void *shmaddr, int shmflg);
返回值:成功映射得到共享内存的首地址
失败NULL
参数:shmid:共享内存的ID号
shmaddr :一般设置为NULL,表示由系统给我自动分配得到共享内存的首地址
shmflg :一般设置为0,表示可读可写
1.3 解除映射
int shmdt(const void *shmaddr);
参数:shmaddr --》刚才映射得到的首地址
1.4 多功能函数,删除共享内存,设置,获取共享内存的属性信息
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:cmd :IPC_STAT //我想获取共享内存属性信息
IPC_SET //我想设置共享内存的属性信息(只能设置权限,大小无法修改)
IPC_RMID //我想删除共享内存
buf :结构体,用来保存共享内存的属性信息
struct shmid_ds {
struct ipc_perm shm_perm; //权限
size_t shm_segsz; //大小
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; //进程的ID号
pid_t shm_lpid; //最后一个映射的进程的ID
shmatt_t shm_nattch; //连接数
};
struct ipc_perm {
key_t __key; //键值
unsigned short mode; //权限
};
2 代码示例
int main()
{
int shmid;
//申请共享内存
shmid=shmget(54544,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
if(shmid==-1)
{
//进一步分析错误原因
if(errno==EEXIST) //共享内存已经存在
{
shmid=shmget(54544,1024,0777); //打开共享内存
}
else //其他错误
{
perror("申请失败!\n");
return -1;
}
}
//映射得到首地址
char *p=shmat(shmid,NULL,0);
if(p==NULL)
{
perror("映射失败!\n");
return -1;
}
//访问另外一个进程存放到共享内存中的信息
printf("共享内存中其它进程发送过来的信息是:%s\n",p);
//定义结构体变量,用于存放获取到的属性信息
struct shmid_ds myds;
//获取你刚才申请成功的那个共享内存的属性信息
shmctl(shmid,IPC_STAT,&myds);
printf("大小是:%ld\n",myds.shm_segsz);
printf("键值是:%x\n",myds.shm_perm.__key);
printf("权限是:%o\n",myds.shm_perm.mode);
}
总结
本文主要讲解了共享内存的原理和使用实例。