共享内存是进程间通信的最为高效的方式,为了实现多个进程间的数据交换,内核专门开辟出一块内存专门用来创建共享内存块,然后需要的进程只需要建立映射,将这个共享内存映射到自己的私有地址,便可以直接访问和操作了,任何一个进程改了该内存上的数据,其它映射的进程都可以马上用到。
相关知识图如下:
代码示例:shmemory.c
1 #include <assert.h>
2 #include <ctype.h>
3 #include <errno.h>
4 #include <limits.h>
5 #include <string.h>
6 #include <stdarg.h>
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <unistd.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <sys/ipc.h>
13 #include <sys/shm.h>
14 /***********************************************************
15 功能说明:共享内存示例
16 author: linux.sir@qq.com
17
18 ***********************************************************/
19
20 int main(int argc, char * argv[])
21 {
22 if(argc<2)
23 {
24 printf("请输入需要共享的数据\n");
25 exit(0);
26
27 }
28 int sid = getShm();
29
30 pid_t pid = fork();
31 if(pid>0)
32 {
33 char *padd = shmat(sid,0,0);//建立映射,将共享内存映射为自己的私有地址
34 printf("父进程映射完成\n");
35
36
37 strcpy(padd, argv[1]);
38 shmdt(padd);
39
40 }else if(pid==0)
41 {
42 char *cadd = shmat(sid,0,0);//建立映射,将共享内存映射为自己的私有地址,
43 printf("子进程映射完成\n");
44
45 printf("print shm from child:%s\n", cadd);
46 shmdt(cadd);
47
48 }
49
50
51 exit(0);
52
53
54
55
56
57
58 }
59 /**********************************************************
60
61 方法功能:创建共享内存块
62
63 **********************************************************/
64 int getShm()
65 {
66
67 int id = shmget(IPC_PRIVATE,512,0755);//创建一块新共享内存
68 if(id<0)
69 {
70 perror("shmget");
71 exit(-1);
72
73 }
74 return id;
75
76
77
78 }
运行结果如下: