System V共享内存资料,转载自http://www.cnblogs.com/xiaobaigang/archive/2011/07/16/2108042.html
2011-10-15 19:21
585 查看
内存映射图
所用主要函数:shmget(),shmat(),shmctl(),shmdt()
shmget:通过文件描述符(一般为绝对路径名)产生Key,创建新的共享内存区(最大4096KB)
shmat: 将共享内存区映射到调用进程(A,B进程)的地址空间。
shmctl: 设置(IPC_SET),获取(IPC_STAT),删除(IPC_RMID)共享内存区。
shmdt():进程删除共享内存区映射的内存段
*********************程序相关信息*********************/
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main()
{
int pid,shmid;//后者为共享内存识别代号
char *write_address;
char *read_address;
struct shmid_ds dsbuf;
if((shmid=shmget(IPC_PRIVATE,32,0))<0)//分配共享内存
{
printf("shmid共享内存分配出现错误。\n");
exit(1);
}
else
printf("shmid共享内存分配成功,共享内存识别代号为:%d。\n",shmid);
if((pid=fork())<0)
{
printf("fork函数调用出现错误!\n");
exit(2);
}
else if(pid>0)//父进程,向共享内存中写入数据
{
printf("父进程的ID是:%d\n",getpid());
write_address=(char *)shmat(shmid,NULL,0);//连接共享内存
if((int)write_address==-1)
{
printf("shmat连接共享内存错误。\n");
exit(3);
}
else
{
printf("shmat连接共享内存成功。\n");
strcpy(write_address,"我是写入共享内存的测试数据");//将数据写入共享内存
printf("写入共享内存的信息为“%s”。\n",write_address);
if((shmdt((void *)write_address))<0)//断开与共享内存的连接
printf("shmdt共享内存断开错误。\n");
else
printf("shmdt共享内存断开成功。\n");
sleep(2);
return;
}
}
else//子进程,从共享内存中读取数据
{
sleep(2);//等待父进程写入共享内存完毕
printf("子进程ID是:%d\n",getpid());
if((shmctl(shmid,IPC_STAT,&dsbuf))<0)
{
printf("shmctl获取共享内存数据结构出现错误。\n");
exit(4);
}
else
{
printf("shmctl获取共享内存数据结构成功。\n建立这个共享内存的进程ID是:%d\n",dsbuf.shm_cpid);
printf("该共享内存的大小为:%d\n",dsbuf.shm_segsz);
if((read_address=(char *)shmat(shmid,0,0))<0)//连接共享内存
{
printf("shmat连接共享内存出现错误。\n");
exit(5);
}
else
{
printf("自共享内存中读取的信息为:“%s”。\n",read_address);
printf("最后一个操作该共享内存的进程ID是:%d\n",dsbuf.shm_lpid);
if((shmdt((void *)read_address))<0)//断开与共享内存的连接
{
printf("shmdt共享内存断开错误。\n");
exit(6);
}
else
printf("shmdt共享内存断开成功。\n");
if(shmctl(shmid,IPC_RMID,NULL)<0)//删除共享内存及其数据结构
{
printf("shmctl删除共享内存及其数据结构出现错误。\n");
exit(7);
}
else
printf("shmctl删除共享内存及其数据结构成功。\n");
exit(0);
}
}
}
}
/*********************程序运行结果*********************
相关文章推荐
- SQL高级查询 原文转载自:http://www.cnblogs.com/hoojo/archive/2011/07/16/2108129.html
- 结构体对齐详解(转载自http://www.cnblogs.com/motadou/archive/2009/01/17/1558438.html)
- 重提URL Rewrite(转载:http://www.cnblogs.com/JeffreyZhao/archive/2008/01/12/Url-Rewrite-1.html)
- 转载String分析 (http://www.cnblogs.com/fancydeepin/archive/2013/04/22/min-snail-speak_String.html)
- Android实现下拉导航选择菜单效果【转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/07/31/2617488.html】
- Android学习笔记之AndroidManifest.xml文件解析【转载地址:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html】
- 资产和幸福感 转载自:http://www.cnblogs.com/JimmyZhang/archive/2009/08/11/1543312.html
- 异或转载http://www.cnblogs.com/this-543273659/archive/2011/08/30/2159819.html
- jquery easyui 弹出消息框 (转载) jQuery EasyUI API 中文文档 - 消息框(Messager) http://www.cnblogs.com/hantianwei/archive/2012/03/19/2407113.html
- <转载>http头 http://www.cnblogs.com/meil/archive/2007/03/06/665843.html
- 转载:.net 操作FTP from http://www.cnblogs.com/aierong/archive/2008/12/08/ftp.html
- Android LayoutInflater详解 (转载:http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html)
- C#正则表达式整理备忘 转载(http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html)
- Android实现XML解析技术 (转载http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html)
- 存储过程使用事物的几种方式 转载自--http://www.cnblogs.com/chengxiaoming/archive/2010/06/11/1756163.html
- Makefile 中:= ?= += =的区别 转载自http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html
- trie 转载(来源于http://www.cnblogs.com/njuzyc/archive/2012/01/25/2329332.html)
- php 程序员,转载自: http://www.cnblogs.com/chinacode/archive/2010/09/10/1823342.html
- Android应用视觉效果设计技巧(转载http://www.cnblogs.com/hanyonglu/archive/2012/03/02/2376451.html)
- Android实现推送方式解决方案【转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html】