一.对共享内存的认识
(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 }
运行结果: