码迷,mamicode.com
首页 > 系统相关 > 详细

进程间通信之共享内存

时间:2016-04-20 18:14:34      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:进程间通信之共享内存

一.对共享内存的认识

    (1)共享内存是一种最为高效的进程间通信,进程可以直接读写内存,而不需要任何数据的拷贝。

    (2)为了在多个进程间交换信息,内核专门流出了一块内存区,可以由需要访问的进程将其映射到自己的私有空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。

    (3)由于多个进程共享一块内存,因此也需要依靠某种同步机制。

二.共享内存的操作流程

    (1)创建/打开共享内存。

    (2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。

    (3)撤销共享内存映射。

    (4)删除共享内存对象。

三.实现代码

    shm.h

  1 #include<stdio.h>

  2 #include<sys/shm.h>

  3 #include<sys/ipc.h>

  4 #include<unistd.h>

  5 #include<sys/types.h>

  6 #include<sys/wait.h>

  7 #define _PATH_ "."

  8 #define _PROJ_ID_ 0x6666

  9 #define _SHM_SIZE_ 1024*4

 10 int get_shm();

 11 char *at_shm(int shm_id);

 12 int dt_shm(char* addr);

 13 int destroy_shm(int shm_id);

    shm.c

    

  1 #include "shm.h"

  2 int get_shm()

  3 {

  4         key_t _key=ftok(_PATH_,_PROJ_ID_);

  5         int flag=IPC_CREAT|IPC_EXCL|0666;

  6         int shm_id=shmget(_key,_SHM_SIZE_,flag);

  7         if(shm_id<0)

  8         {

  9                 perror("shmget");

 10                 return -1;

 11         }               

 12         return shm_id;

 13 }       

 14 char *at_shm(int shm_id)

 15 {

 16         return shmat(shm_id,NULL,0);

 17 }       

 18 int dt_shm(char* addr)

 19 {

 20         return shmdt(addr);

 21 }       

 22 int destroy_shm(int shm_id)

 23 {

 24         return shmctl(shm_id,IPC_RMID,NULL);

 25 }

    测试函数test.c

    

  1 #include "shm.h"

  2 

  3 int main()

  4 {

  5         int shm_id=get_shm();

  6         pid_t id=fork();

  7         if(id<0)

  8         {

  9                 perror("fork");

 10                 return -1;

 11         }

 12         else if(id==0)

 13         {

 14                 char *buf=at_shm(shm_id);

 15                 int i=0;

 16                 while(i<10)

 17                 {

 18                         buf[i]=‘X‘;

 19                         i++;

 20                 }

 21                 buf[10]=‘\0‘;

 22                 dt_shm(buf);

 23         }

 24         else

 25         {

 26                 char *buf=at_shm(shm_id);

 27                 sleep(2);

 28                 printf("%s\n",buf);

 29                 dt_shm(buf);

 30                 //waitpid(id,NULL,0);

 31                 destroy_shm(shm_id);

 32         }

 33         return 0;

 34 }

运行结果:

技术分享


本文出自 “zwy” 博客,请务必保留此出处http://10548195.blog.51cto.com/10538195/1765874

进程间通信之共享内存

标签:进程间通信之共享内存

原文地址:http://10548195.blog.51cto.com/10538195/1765874

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!