Linux的共享内存技术

源代码是从别人的文章中抄过来的,不是原创,不过写得不错,主要是描述两个不同的进程从共享内存中存取数据的技术,我加了点分析: 第一个是写数据: /***** testwrite.c *******/ #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <unistd.h> 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 <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <unistd.h> 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函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值