Linux (六)进程间通信(共享内存)

上篇博客我们讲了,匿名管道,命名管道,消息队列,并使用了他们,初步了解了进程间通信的概念。下面我们要说共享内存。

共享内存函数
shmget函数
功能:用来创建共享内存
原型
int shmget(key_t key,size_t size,int shmflg);
参数
key:这个共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成,他们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该内存段的表示码,失败返回-1

shmat函数
功能:将共享内存段连接到进程地址空间
原型
void *shmat(int shmid,const void *shmaddr,int shmflg);
参数
shmid:共享内存标识码
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存的第一个字节,失败返回-1
说明:
shmaddr为NULL,核心自动选择地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了HSM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr - (shmaddr %SHMLVA)
shmflg = SHM_RDONLY,表示连接操作用来只读共享内存

shmdt函数
功能:将共享内存段与当前进程脱离
原型
int shmdt(const void *shmaddr);
参数
shmaddr:有shmat所返回的指针
返回值:成功返回0;失败返回-1;
注意:将共享内存段与当前进程脱离不等于删除共享内存段

shmctl函数
功能:用于控制共享内存
原型
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
参数:
shmid:由shmget返回的共享内存的标识码
cmd:将要采取的动作(由三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

命令:IPC_STAT :把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET:当进程有足够权限的前提下, 把共享内存的当前关联值设置为shmid_ds数据结构中给出的值
IPC_RMID:删除共享内存段
下面就是具体的代码实现
这里写图片描述这里写图片描述这里写图片描述这里写图片描述

下面就是实现的效果
这里写图片描述

这里写图片描述


如有错误请指出,谢谢

猜你喜欢

转载自blog.csdn.net/mignatian/article/details/79957836