Linux的共享内存技术

分类: 系统管理   出处:iocblog整理  更新时间:2008-06-01   添加到收藏  
第一个是写数据:
/***** testwrite.c *******/
#include
#include
#include
#include
typedef struct{[iocblog.net 来源]
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
char temp;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key==-1)
perror("ftok error");
/*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
shm_id=shmget(key,4096,ipc_creat);
if(shm_id==-1)
{
perror("shmget error");
return;
}
/*将这块共享内存区附加到自己的内存段*/
p_map=(people*)shmat(shm_id,null,0);
temp='a';
for(i = 0;i<10;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=20+i;
}
/*写数据完毕,将其从自己的内存段中“删除”出去*/
if(shmdt(p_map)==-1)
perror(" detach error ");
}

/*读进程首先要得到那块内存块,这个时候,ftok根据文件名和id创建的key就
很用了,步骤同创建是一样的*/
/********** testread.c ************/
#include
#include
#include
#include
typedef struct{
char name[4];
int age;
} people;
main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/dev/shm/myshm2";
key = ftok(name,0);
if(key == -1)
perror("ftok error");
shm_id = shmget(key,4096,ipc_creat);
if(shm_id == -1)
{
perror("shmget error");
return;
}
p_map = (people*)shmat(shm_id,null,0);
for(i = 0;i<10;i++)
{
printf( "name:%s ",(*(p_map+i)).name );
printf( "age %d ",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error ");
}

注:事实上,ftok函数仅仅是根据文件名和id生成一个起标识作用的key,根据《gnu linux编程指南》说,linux下实现这一函数还有点问题,不推荐用。于是我一般来说都是自己定义一个唯一的key,而不使用ftok函数。
Tag: 共享内存



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。