今天我们来谈一谈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秒内读取,则读不到:
5秒内执行shmr可以读到:
以上就是关于Linux进程间通信–共享内存的介绍,尚有不足之处,请各位大神指正。
salute CLC