Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7143
  • 博文数量: 10
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-09 23:01
文章分类

全部博文(10)

文章存档

2013年(10)

我的朋友

分类:

2013-01-11 20:34:31

原文地址:共享内存 作者:1987hanen

可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,
不需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区。这段
内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读
写这一内存区而不需要进行数据的拷贝,从而大大提高了效率。当然,由于多个进程共享
一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等.
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget,也
就是从内存中获得一段共享内存区域。第二步映射共享内存,也就是把这段创建的共享内存
映射到具体的进程空间去,这里使用的函数是shmat。到这里,就可以使用这段共享内存了,
也就是可以使用不带缓冲的I/O 读写命令对其进行操作。除此之外,当然还有撤销映射的操
作,其函数为shmdt.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PERM S_IRUSR|S_IWUSR
/* 共享内存 */
int main(int argc,char **argv)
{
 int shmid;
 char *p_addr,*c_addr;
 
 if(argc!=2)
 {
  fprintf(stderr,"Usage:%s\n\a",argv[0]);
  exit(1);
 }
 /* 创建共享内存 */ 
 if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
 {
  fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
  exit(1);
 }
 /* 创建子进程 */
 if(fork()) // 父进程写
 {
  p_addr=shmat(shmid,0,0);  //第二个0为系统自动指定;
  memset(p_addr,'\0',1024);
  strncpy(p_addr,argv[1],1024);
  wait(NULL); // 释放资源,不关心终止状态
  shmdt(p_addr);
  exit(0);
 }
 else       // 子进程读
 {
  sleep(1); // 暂停1秒  
  c_addr=shmat(shmid,0,0);   //第二个0为系统自动指定;
  printf("Client get %s\n",c_addr);
  exit(0);
 }
}
阅读(151) | 评论(0) | 转发(0) |
0

上一篇:android菜单

下一篇:共享内存

给主人留下些什么吧!~~