共享内存使用的基本思路和接口
2013-12-02 09:33
225 查看
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #define MAXLINE 256 /* *全文缺少错误检测和处理,仅用于了解共享内存使用的基本思路和基本接口 *文章本意在于记录学习,程序有任何不妥之处,望不吝指正 * */ /*生成创建共享内存需要的key*/ key_t mk_key() { /*0010只是我随便写的,没什么意思*/ return ftok(".",0010); } int Shmget(key_t key,int shm_total) { int id=0; /*创建共享内存,0666是权限,IPC_CREAT是标志位,表示存在则返回id,不存在则创建*/ if((id=shmget(key,MAXLINE*shm_total,0666|IPC_CREAT))==-1) { perror("shmget"); exit(-1); } int load_data(int id,int pos,char *text,int total) { char *shm_p; /*获取共享内存首地址--个人理解和指针地址差不多,存放东西用的*/ shm_p=(char *)shmat(id,NULL,0); /*向上面获取的地址放入字符串,pos表示位置偏移量*/ memcpy(shm_p+20+pos*MAXLINE,text,MAXLINE); /*脱离共享内存--个人不知道有什么用,不脱离也可以啊*/ shmdt(shm_p); return 0; } int read_data(int id,int total) { char *shm_p; int index=0; char text[MAXLINE]; /*获取共享内存首地址--个人理解和指针地址差不多,存放东西用的*/ shm_p=(char *)shmat(id,NULL,0); /*将来用于测试fork*/ printf("pid :%d\n",getpid()); /*循环读取内容index表示位置偏移量,total表示总量*/ while(1) { if(index == total) break; memcpy(text,shm_p+20+index*MAXLINE,MAXLINE); /*这里我打出来是测试看看的了,可以调用其他函数进一步处理*/ printf("%s\n",text); index++; } /*脱离共享内存*/ shmdt(shm_p); return 0; } /*获取共享内存的基本信息,可以把结构体打印出来看看*/ int shm_info(id) { struct shmid_ds buf; shmctl(id,IPC_STAT,&buf); return 0; } /*删除共享内存*/ int destory_shm(id) { return shmctl(id,IPC_RMID,0); } main() { int index=0; int total=0; int id=0; char buff[MAXLINE]; char file_name[MAXLINE]; FILE *in_file; /*定义文件路径和文件名称*/ sprintf(file_name,"%s/%s",getenv("HOME"),"/tmp/1.dat"); if((in_file=fopen(file_name,"r"))==NULL) { perror("fopen"); exit(-1); } /*计算文件总行数*/ while(fgets(buff,MAXLINE,in_file) !=NULL) total++; /*重置文件偏移*/ fseek(in_file,0,SEEK_SET); /*创建共享内存,获取id*/ id=Shmget(mk_key(),total); while(fgets(buff,MAXLINE,in_file) !=NULL) { /*将文本刷入共享内存*/ load_data(id,index,buff,total); index++; } /*读出来测试一下*/ read_data(id,total); /*删除共享内存*/ destory_shm(id); /*关闭文件标识*/ fclose(in_file); }
相关文章推荐
- 共享内存使用的基本思路和接口
- linux基础编程 共享内存 使用内存映射接口mmap系统调用 blog.csdn.net/ghostyu/article/details/7736733
- 消息队列的基本使用思路和接口介绍
- 共享内存:使用内存映射接口mmap系统调用
- linux基础编程 共享内存 使用内存映射接口mmap系统调用
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
- IOS开发---OC语言-㉗内存管理ARC的基本使用
- (转)Linux共享内存使用常见陷阱与分析(4)-共享内存删除的陷阱
- 共享内存的使用
- iOS 非ARC基本内存管理系列 5-autorelease方法使用总结
- IO端口和IO内存的区别及分别使用的函数接口
- 0907使用write函数向共享内存中写入数据,实现不同进程间的数据信息传递
- eXtremeDB 共享内存使用时的注意事项
- linux 共享内存的使用
- 使用 PHP 直接在共享内存中存储数据集
- Linux进程间通信(IPC)编程实践(六)共享内存的使用-mmap
- 进程之间使用共享内存通信....
- 使用mmap函数进行内核空间和用户空间的共享内存通信
- 使用内存共享机制进程间通讯