Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380998
  • 博文数量: 83
  • 博客积分: 1650
  • 博客等级: 上尉
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-18 18:22
文章分类
文章存档

2021年(1)

2016年(1)

2015年(2)

2014年(3)

2013年(12)

2012年(16)

2011年(18)

2010年(30)

分类: LINUX

2010-11-11 00:25:10

可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,
不需要任何数据的拷贝。为了在多个进程间交换信息,内核专门留出了一块内存区。这段
内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读
写这一内存区而不需要进行数据的拷贝,从而大大提高了效率。当然,由于多个进程共享
一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等.
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是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);
 }
}
阅读(639) | 评论(0) | 转发(1) |
0

上一篇:线程(4)线程访问控制

下一篇:流水线

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