使用共享内存实现IPC通信

共享内存的使用流程

参考博文:
https://www.cnblogs.com/LiuYanYGZ/p/14292524.html

1.向内核申请一块指定大小的内存

2.如果有两个进程,需要通信,可以使用这块共享内存来完成,先创建出这两个进程
进程A
进程B

3.进程A和进程B分别和共享内存进程关联
拿到共享内存的地址——>首地址

4.两个进程可以通过这个首地址对共享内存进行读/写操作

5.如果这个进程不再使用这块共享内存,需要和共享内存断开关联
进程退出,对共享内存是没有任何影响的。

6.当不再使用共享内存的时候,需要将共享内存销毁

共四个函数
创建或打开shmget、关联shmad、取消关联shmdt、控制(主要用于删除)shmctl
头文件都一样:

#include <sys/shm.h>
#include <sys/ipc.h>

1.创建或打开共享内存。

shmget()函数
//创建共享内存
//共享内存已经存在,打开共享内存
//可以创建多块共享内存

int shmget(key_t key,size_t size,int shmflg);

创建或打开共享内存函数shmget()
返回值是一个整数,用int shmid记录它的返回值,用shmid可以访问key值为100的这块共享内存

int shmid = shmget(100,1024,IPC_CREAT);
//记录创建共享内存之后的返回值,用这个返回值可以访问共享内存

参数:
key_t key:通过这个key记录共享内存在内核的位置。需要的是任意一个大于0的整数就可以,不能等于0,随便指定一个大于0的数就行,如果不想随便指定的话,那我们后面会介绍一个ftok()函数。

size:指定共享内存的大小。
如果是shmget是要打开一块共享内存,那么size就写0就可以。

int shmid = shmget(100,0,0);//打开刚刚创建的key为100的这块共享内存

int shmflg:创建共享内存时,类似于open函数的flag。
IPC_CREAT:创建共享内存并给出操作权限。
比如:IPC_CREAT|0644就是创建共享内存并将权限设为0644,文件所有者可读可写,同组用户只读,其他用户只读。
IPC_CREAT|IPC_EXCL:检测共享内存是否存在。
如果存在函数返回-1,
不存在返回0。

返回值:成功创建或打开,得到一个整型数–>对应这块共享内存。
失败返回-1.

2.将当前进程和共享内存关联在一起

(void* )shmat(int shmid,const void* shmaddr,int shmflg);
参数:
shmid:就是上面那个shmget()的返回值,通过这个参数访问共享内存。

shmaddr:指定共享内存在内核中的位置,如果不想自己指定它在内核中的位置的话,就写成NULL,写成NULL就是委托内核自己找一个合适的位置。

shmflg:关联成功后对共享内存的操作权限
SHM_RDONLY:只读
写成0:可读写

返回值:如果关联成功,那么返回值是一个地址,是一个void类型的指针。这个指针是共享内存的首地址。
如果关联失败则返回(void
)-1。

应用:
//将当前进程关联shmid这块共享内存,共享内存在内核中的位置由内核自己找合适的位置放置,权限为可读写。用void* 类型的指针ptr来保存它的返回值,ptr就是这块共享内存的首地址。

void* ptr = shmat(shmid,NULL,0);

//数据写入内存

char* pt = "xxxx";
memcpy(ptr,pt,strlen(pt)+1); //把pt这个指针上的内容写到ptr上去。

//读内存

printf("%s",(char*)ptr);

3.将共享内存和当前进程分离

//进程和共享内存分离->二者就没有关系了。

int shmdt(const void* shmaddr);

参数:shmaddr:共享

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值