进程间通信之共享内存(四)
来源:互联网 发布:海外网络推广靠谱的吗 编辑:程序博客网 时间: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);#endifcommon.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
作者水平有限,若有问题,请留言,谢谢!!!
阅读全文
0 0
- 进程间通信方式之(四)共享内存
- 进程间通信之共享内存(四)
- 进程间通信(四)---- 共享内存
- 进程间通信(四)共享内存
- linux进程间通信之共享内存
- 进程间通信之共享内存篇
- linux进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存篇
- 进程间通信之共享内存
- Linux进程间通信之共享内存
- Linux进程间通信之共享内存
- 进程间通信之共享内存
- Windows进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- Jenkins的安装与系统配置
- 设计模式—装饰模式(三)
- CF809A:Do you want a date?(数学 & 思维)
- 初识java语言
- Jenkins学习
- 进程间通信之共享内存(四)
- poj 1920 汉诺塔移动到某一种指定位置的最小步数
- java对象模型和内存参数
- Android:自定义组合控件
- C/C++ 学习常用--进行时
- Struts2拦截器的使用 (详解)
- Sql语句中IN和exists的区别及应用
- AAC ADTS格式分析
- Meteor Shower POJ