第一个是写数据:
/***** 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函数。
相关文章
Shell脚本实现vi_cp_mv前自动备份源文件
VPM小型虚拟机软件在多平台上体验Linux
介绍Linux操作系统下的U 硬件设备驱动
Linux下利用Squid构建高速的ProxyServer
Linux的共享内存技术
Apache服务器虚拟主机设置技术深入解析
文件权限管理-POSIXACL
Linux服务器历险优化Linux
Linux实用代码--文件系统操作
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛