进程间通信之共享内存(四)

来源:互联网 发布:海外网络推广靠谱的吗 编辑:程序博客网 时间:2024/06/03 10:03
共享内存
共享内存是将同一份物理内存映射到不同进程的地址空间中去;
共享内存是不带任何互斥和同步机制的进程间通信;
共享内存是所有进程间通信中最快的;
注:共享内存不需要数据的拷贝;
共享内存的生命周期随内核;
共享内存可以实现进程间的双向通信;

(一)创建共享内存

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 0x6666int 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"//serverint 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"//clientint 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:allall:client serverclient:client.c common.c    gcc -o $@ $^server:server.c common.c    gcc -o $@ $^.PHONY:cleanclean:    rm -rf server client

作者水平有限,若有问题,请留言,谢谢!!!

原创粉丝点击