【Linux基础】共享内存应用

共享内存相关函数
使用共享内存在进程间通信,首先得创建共享内存,这里使用函数是shmget(shmget返回相应的标识符),然后调用shmat()完成共享内存区域映射到进程地址空间。这时候进程就可以对共享内存进行操作了。操作完成后可以撤销映射,通过函数shmdt实现。
共享内存相关函数语法如表 9‑3、表 9‑4、表 9‑5所示:

01.jpg (91.53 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-10 09:00 上传

02.jpg (29.61 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

2013-6-10 09:00 上传


2. 共享内存实例
分别写两个程序,一程序把数据写入共享内存,一程序从共享内存拿数据。
程序一:
/*shm_write.c*?
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<unistd.h>
#include <string.h>
#include<stdio.h>
typedef struct
{
char name[5];
int age;
}people;
main(int argc,char **argv)
{
int shm_id,i;
char temp;
people *p_map;
char* shmname="/dev/shm/myshm";
key_t key=ftok(shmname,0);
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
perror("error shmget");
return;
}
p_map=(people*)shmat(shm_id,NULL,0);
temp='a';
for(i=0;i<8;i++)
{
temp+=1;
memcpy((*(p_map+i)).name,&temp,1);
(*(p_map+i)).age=18+i;
}
if(shmdt(p_map)==-1)
perror("error shmdt");
}
程序二:
/*shm_read.c*/
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<unistd.h>
#include <string.h>
#include<stdio.h>
typedef struct
{
char name[5];
int age;
}people;
main(int argc,char **argv)
{
int shm_id,i;
char temp;
people *p_map;
char* shmname="/dev/shm/myshm";
key_t key=ftok(shmname,0);
shm_id=shmget(key,4096,IPC_CREAT);
if(shm_id==-1)
perror("error shmget");
return;
}
p_map=(people *)shmat(shm_id,NULL,0);
temp='a';
for(i=0;i<8;i++)
{
printf("name:%s age:%d \n",(*(p_map+i)).name,(*(p_map+i)).age);
}
if(shmdt(p_map)==-1)
perror("error shmdt");
}
编译后,首先运行程序一,再运行程序二。结果如下:
[root@localhost shm]# ./shm_write
[root@localhost shm]# ./shm_rread
name:b age:18
name:c age:19
name:d age:20
name:e age:21
name:f age:22
name:g age:23
name:h age:24
name:i age:25
注意事项
共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。在共享内存段中都是以字符串的默认结束符为一条信息的结尾。每个进程在读写时都遵守这个规则,就不会破坏数据的完整性。
本文转载于唯C教育,【Linux基础】共享内存应用
http://www.weicedu.com/forum.php?mod=viewthread&tid=138&fromuid=4
(出处: http://www.weicedu.com/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值