java 读取linux共享内存_Linux进程间通信--共享内存(Shared memory)

今天我们来谈一谈Linux进程间通信的方式之一共享内存

我们先来看看共享内存的定义:

共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

怎么使用共享内存,有以下几点步骤:

1.创建共享内存 shmget

2.映射到物理内存 shmat

3.数据读写

4.释放共享内存shmdt

5.销毁共享内存shmctl

介绍一下api:

1.shmget

原型:

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

示例:

shmget(key,1024*4,IPC_CREAT|0666);

2.shmat

原型:

void *shmat(int shmid, const void *shmaddr, int shmflg);

示例:

shmat(shmid,0,0);

最简单的方法——让系统自动安排共享内存

3.shmdt

原型

int shmdt(const void *shmaddr)

示例:

shmdt(shmaddr);

其中shmaddr=shmat(shmid,0,0);连接的共享内存的起始地址

4.shmctl

原型:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

示例:

shmctl(shmid,IPC_RMID,0);

接下来我们看看实际应用场景:

输入端开辟共享内存并且映射,进行写入,读取端映射相同id号的共享内存,直接读取(共享内存就像两个人可以在同一张纸上写字一样,其中一个人写了,你直接可以读到)

编程示例:

输入端:

#include

#include

#include

#include

#include

int main()

{

int shmid;

char *shmaddr;

key_t key;

key=ftok(".",1);

shmid= shmget(key,1024*4,IPC_CREAT|0666);

if(shmid ==-1){

printf("shmeget error!\n");

exit(-1);

}

shmaddr =shmat(shmid,0,0);

printf("shmat complete\n");

strcpy(shmaddr,"made by chenkai");

sleep(5);

shmdt(shmaddr);

shmctl(shmid,IPC_RMID,0);

printf("quit!\n");

return 0;

读取端:

#include

#include

#include

#include

#include

int main()

{

int shmid;

char *shmaddr;

key_t key;

key=ftok(".",1);

shmid= shmget(key,1024*4,0);

if(shmid ==-1){

printf("shmeget error!\n");

exit(-1);

}

shmaddr =shmat(shmid,0,0);

printf("shmat complete\n");

printf("data:%s\n",shmaddr);

shmdt(shmaddr);

printf("quit!\n");

return 0;

}

输入端写入完毕,5秒后销毁共享内存,如果读取端未在5秒内读取,则读不到:

cdd66f912e21e6091b9a2b63f24801b2.png

5秒内执行shmr可以读到:

368922c0be4ca756b9596df4d36956ae.png以上就是关于Linux进程间通信–共享内存的介绍,尚有不足之处,请各位大神指正。

salute CLC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值