频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

Linux的共享内存技术

来源: 作者: 出处:巧巧读书 2007-08-28 进入讨论组

  第一个是写数据:
/***** testwrite.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;
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\n",(*(p_map+i)).name );
printf( "age %d\n",(*(p_map+i)).age );
}
if(shmdt(p_map) == -1)
perror(" detach error ");
}

注:事实上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux编程指南》说,Linux下实现这一函数还有点问题,不推荐用。于是我一般来说都是自己定义一个唯一的key,而不使用ftok函数。静态页面:http://www.qqread.com/linux/2007/08/y328253.html 更多文章 更多内容请看共享上网专题三机互联与共享专题局域网共享专题专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章