共享内存
共享内存是将同一份物理内存映射到不同进程的地址空间中去;
共享内存是不带任何互斥和同步机制的进程间通信;
共享内存是所有进程间通信中最快的;
注:共享内存不需要数据的拷贝;
共享内存的生命周期随内核;
共享内存可以实现进程间的双向通信;
(一)创建共享内存
int shmget(key_t key,size_t size,int shmflg);
参数:
key: key_t key = ftok(const char* pathname,int proj_id);
size:为要创建的共享内存的大小;一般为页大小的整数倍;
shmflg:(1)shmflg = IPC_CREAT | IPC_EXCL;若为key的共享内存存在则:错误返回;若不存在,则:创建;
(2)shmflg = IPC_CREAT;若为key的共享内存存在则:打开;若不存在:创建;
返回值:
(1)创建成功:返回该共享内存的标识符;
(2)创建失败:返回-1;
(
二)挂接(将物理内存映射到进程的地址空间)
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid:挂接的共享内存的标识符;
shmaddr:NULL;
shmflg:0;
返回值:
(1)挂接成功:返回所挂接的共享内存的地址;
(2)挂接失败:返回-1;
(三)去挂接
int shmdt(const void *shmaddr);
参数:
shmaddr:为shmat的返回值(即为所挂接的共享内存的地址);
返回值;
(1)去挂接成功:返回0;
(2)去挂接失败:返回-1;
(四)释放共享内存
int shmctl(int semid,int cmd,struct shmid_ds* buf);
参数:
semid:共享内存的标识符;
cmd:IPC_RMID表示进行删除操作;
buf;当进行共享内存块释放时:为NULL;
返回值:
(1)释放成功:返回0;
(2)释放失败:返回-1;
common.h
#ifndef _COMMON_H
#define _COMMON_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define PATHNAME "/home/cm"
#define PROJ_ID 0x6666
int Creat_ShareMemory(int size);
int Get_ShareMemory(int size);
int Destory_ShareMemory(int shm_id);
#endif
common.c
#include"common.h"
static int CommonCreat_ShareMemory(int size,int flags)
{
key_t key = ftok(PATHNAME,PROJ_ID);
if(key < 0)
{
perror("ftok");
return -1;
}
int shm_id = shmget(key,size,flags);
if(shm_id < 0)
{
perror("shmget");
return -2;
}
return shm_id;
}
int Creat_ShareMemory(int size)
{
return CommonCreat_ShareMemory(size,IPC_CREAT | IPC_EXCL | 0666);
}
int Get_ShareMemory(int size)
{
return CommonCreat_ShareMemory(size,IPC_CREAT);
}
int Destory_ShareMemory(int shm_id)
{
int ret = shmctl(shm_id,IPC_RMID,NULL);
if(ret < 0)
{
perror("shmctl");
return -1;
}
return 0;
}
server.c
#include"common.h"
//server
int main()
{
int shm_id = Get_ShareMemory(4096);
//printf("shm_id = %d\n",shm_id);
char* addr = shmat(shm_id,NULL,0);
//sleep(2);
int i =0;
while(i<26)
{
printf("client# %s\n",addr);
i++;
}
shmdt(addr);
sleep(2);
Destory_ShareMemory(shm_id);
return 0;
}
client.c
#include"common.h"
//client
int main()
{
int shm_id = Creat_ShareMemory(4096);
sleep(1);
char* addr = shmat(shm_id,NULL,0);
sleep(2);
int i =0;
while(i<26)
{
addr[i] = 'A'+i;
i++;
addr[i] = 0;
}
shmdt(addr);
sleep(2);
return 0;
}
Makefile
.PHONY:all
all:client server
client:client.c common.c
gcc -o $@ $^
server:server.c common.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -rf server client
作者水平有限,若有问题,请留言,谢谢!!!