您的位置:首页 > 其它

共享内存使用的基本思路和接口

2013-12-02 14:50 351 查看
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: