进程间通讯(ipc)之共享内存:
(1)进程间通讯比较快速的一种,常与信号量一起操作
(2)本质是进程间使用同一块内存
(3)因为进程间使用的是同一块内存,因此在一个进程间改变了共享内存里的数据,其他进程中的同一块共享内存的数据也会随之被改变
我们换个通俗点的说法:现在有小红和小绿,他们是合租室友;但是呢,他们租的房子里面只有一间浴室,然后约定浴室里面地洗发水一起买来用,为了防止别人来他们房子用他们的浴室(就当为了省买洗发水的钱和水费),然后他们就给浴室上了锁,只有他们两个有钥匙,如果有其他人还想来一起合租用浴室就需要他自己再去配一把钥匙,有钥匙的小红和小绿因为有钥匙于是他们就能一起使用浴室,并且里面的东西是共用的;小红和小绿就相当于进程,浴室就是共享内存
相关函数API:
//创建键值函数
//函数头文件
#include <sys/types.h>
#include <sys/ipc.h>
//函数原型
key_t ftok(const char *pathname, int proj_id);
//函数介绍:
/********************************************************
函数作用:用于创建一个键值,
键值作用 :用于进程间通讯(ipc)时的一个标识符,不会因进程退出而消失
形参:pathname:路径名-->通过哪一个路径来获得键值
proj_id( project identifier):项目id:即我们指定给它一个8位(一个字节,最大256)的整数,
同一路径下不能由两个相同的键值
注:其实可以看成路径下的消息队名为给它的数
返回值:
成功:新生成且未被使用的键值
失败:-1
********************************************************/
//创建共享内存
//函数头文件
#include <sys/ipc.h>
#include <sys/shm.h>
//函数原型
int shmget(key_t key, size_t size, int shmflg);
//函数介绍:
/********************************************************
函数作用:用于创建一个共享内存
形参:
key:通过ftok函数创建成功返回的键值
size:共享内存的大小字节数
shmflg:
IPC_CREAT:当共享内存不存在时就创建一个共享内存
(当创建共享内存时需要位或上创建共享内存后它的操作权限)
IPC_EXCL:当共享内存已经存在时就报错
返回值:
成功:共享内存的id号(标识符)
失败:-1
********************************************************/
测试代码:
/*
*创建共享内存
*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
//产生键值
key_t key = ftok(".",1);
if