进程间通信之共享内存
来源:互联网 发布:新装系统无法连接网络 编辑:程序博客网 时间:2024/06/05 20:29
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。但没有同步与互斥机制,所以往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
生命周期:随内核。
共享内存实现机制:在物理内存上申请一块空间,再在页表上添加映射信息,把信息映射到地址空间上,将申请的内存地址的虚拟地址给tast_struct。如图所示:
图示中shm:即为共享内存。大小为4096(4k)的整数倍。shm位于堆栈之间。
实现的相关代码:
comm.h:#ifndef _COMM_H#define _COMM_H#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include<stdlib.h>#define PATHNAME "."#define PROJ_ID 0666int create_shm(size_t size);int get_shm();int destroy_shm(int shmid);#endifcomm.c:#include"comm.h"static int comm_shm(size_t size,int flags){ key_t key = ftok(PATHNAME,PROJ_ID);//if(key< 0)//{//perror("ftok");//return -1;//} int shmid=shmget(key,size,flags); if(shmid<0) { perror("shmget"); } return shmid;}int create_shm(size_t size){ return comm_shm(size,IPC_CREAT|IPC_EXCL|0666);}int get_shm(){ return comm_shm(0,IPC_CREAT);}int destroy_shm(int shmid){ if(shmctl(shmid,IPC_RMID,NULL)<0) { perror("shmctl"); return -1; } return 0;}server.c:#include"comm.h"int main(){ printf("i am a server\n"); int shmid=create_shm(4096); char *buf=shmat(shmid,NULL,0); int idx = 0; while(idx<4096) { buf[idx]='A'+idx%26; sleep(1); idx++; } shmdt(buf); destroy_shm(shmid); return 0;}client.c:#include"comm.h"int main(){ int shmid=get_shm(); char *buf=shmat(shmid,NULL,0); while(1) { printf("%s\n",buf); sleep(1); } shmdt(buf); return 0;}Makefile:.PHONY:allall:server clientserver:comm.c server.c gcc -o $@ $^client:comm.c client.c gcc -o $@ $^.PHONY:cleanclean: rm -f server client
2 0
- linux进程间通信之共享内存
- 进程间通信之共享内存篇
- linux进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存篇
- 进程间通信之共享内存
- Linux进程间通信之共享内存
- Linux进程间通信之共享内存
- 进程间通信之共享内存
- Windows进程间通信之共享内存
- 进程间通信之共享内存
- 进程间通信之共享内存
- QT 进程间通信 之 共享内存
- 进程间通信IPC之--共享内存
- 进程间通信之共享内存
- linux进程间通信之共享内存
- Linux之用户管理
- 给大学生的几条建议
- 【BZOJ 3196】[Tyvj 1730]二逼平衡树
- java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
- bzoj1998[Hnoi2010] Fsk物品调度
- 进程间通信之共享内存
- 数据爬虫(一)
- GBDT好的学习资料
- SOJ 1024
- 坐标移动
- Activity的四种启动模式
- 1.最长平台问题
- js日期格式化-由毫秒数得到年月日
- CCF会议列表——网络与信息安全