一.对共享内存的认识

    (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 }

运行结果:

wKiom1cXQsfxvdsxAAAWGRT8Sqg906.png