1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5 #include <sys/shm.h>
6 #include <sys/ipc.h>
7 #include <string.h>
8 #include <sys/wait.h>
9
print_shmidds(struct shmid_ds * shminfo)10 void print_shmidds(struct shmid_ds *shminfo)
11 {
12 struct ipc_perm shm_perm = shminfo->shm_perm;
13
14 printf("ipc_perm:\n");
15 printf("ipc_perm_key: %d\n", shm_perm.__key);
16 printf("uid: %d\n", shm_perm.uid);
17 printf("gid: %d\n", shm_perm.gid);
18 printf("cuid: %d\n", shm_perm.cuid);
19 printf("cgid: %d\n", shm_perm.cgid);
20 printf("mode: %d\n", shm_perm.mode);
21 printf("seq: %d\n", shm_perm.__seq);
22 printf("\n");
23
24 printf("shmid_ds:\n");
25 printf("shm_atime: %lu\n", shminfo->shm_atime);
26 printf("shm_dtime: %lu\n", shminfo->shm_dtime);
27 printf("shm_ctime: %lu\n", shminfo->shm_ctime);
28 printf("shm_segsz: %lu\n", shminfo->shm_segsz);
29 printf("shm_cpid: %d\n", shminfo->shm_cpid);
30 printf("shm_lpid: %d\n", shminfo->shm_lpid);
31 printf("shm_nattch: %lu\n", shminfo->shm_nattch);
32 printf("\n");
33 }
34
35 const int SHM_SIZE = 9999;
36
main()37 int main()
38 {
39 int shmid;
40 char *shmaddr;
41 key_t key = 6666;
42
43 // 测试shmget
44 shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
45 if (shmid < 0)
46 {
47 perror("shmget failed");
48 exit(EXIT_FAILURE);
49 }
50
51 // 测试shmat
52 shmaddr = shmat(shmid, 0, 0);
53
54 // IPC_STAT:
55 printf("\n");
56 printf("IPC_STAT:\n");
57 struct shmid_ds shminfo2;
58 if (shmctl(shmid, IPC_STAT, &shminfo2) == -1)
59 {
60 // 获取共享内存段信息
61 perror("shmctl");
62 exit(EXIT_FAILURE);
63 }
64 print_shmidds(&shminfo2);
65
66 // 测试shmctl
67 // IPC_INFO
68 printf("IPC_INFO:\n");
69 struct shminfo shmmetainfo;
70 if (shmctl(shmid, IPC_INFO, &shmmetainfo) == -1)
71 { // 获取共享内存段信息
72 perror("shmctl");
73 exit(EXIT_FAILURE);
74 }
75 printf("shmmax: %lu\n", shmmetainfo.shmmax);
76 printf("shmmin: %lu\n", shmmetainfo.shmmin);
77 printf("shmmni: %lu\n", shmmetainfo.shmmni);
78 printf("shmseg: %lu\n", shmmetainfo.shmseg);
79 printf("shmall: %lu\n", shmmetainfo.shmall);
80
81 // SHM_INFO
82 printf("\n");
83 printf("SHM_INFO:\n");
84 struct shm_info shm_info;
85 if (shmctl(shmid, SHM_INFO, &shm_info) == -1)
86 { // 获取共享内存段信息
87 perror("shmctl");
88 exit(EXIT_FAILURE);
89 }
90 printf("__used_ids: %lu\n", shm_info.__used_ids);
91 printf("shm_tot: %lu\n", shm_info.shm_tot);
92 printf("shm_rss: %lu\n", shm_info.shm_rss);
93 printf("shm_swp: %lu\n", shm_info.shm_swp);
94 printf("__swap_attempts: %lu\n", shm_info.__swap_attempts);
95 printf("__swap_successes: %lu\n", shm_info.__swap_successes);
96
97 // SHM_STAT
98 printf("\n");
99 printf("SHM_STAT:\n");
100 struct shmid_ds shminfo0;
101 if (shmctl(shmid, SHM_STAT, &shminfo0) == -1)
102 { // 获取共享内存段信息
103 perror("shmctl");
104 exit(EXIT_FAILURE);
105 }
106 print_shmidds(&shminfo0);
107
108 // SHM_STAT_ANY
109 printf("SHM_STAT_ANY:\n");
110 struct shmid_ds shminfo1;
111 if (shmctl(shmid, SHM_STAT_ANY, &shminfo1) == -1)
112 { // 获取共享内存段信息
113 perror("shmctl");
114 exit(EXIT_FAILURE);
115 }
116 print_shmidds(&shminfo1);
117
118 // IPC_SET
119 printf("\n");
120 printf("IPC_SET:\n");
121 struct shmid_ds shminfo;
122 shminfo.shm_atime = 1;
123 shminfo.shm_dtime = 2;
124 shminfo.shm_ctime = 3;
125 shminfo.shm_segsz = 4;
126 shminfo.shm_cpid = 5;
127 shminfo.shm_lpid = 6;
128 shminfo.shm_nattch = 7;
129 if (shmctl(shmid, IPC_SET, &shminfo) == -1)
130 { // 获取共享内存段信息
131 perror("shmctl");
132 exit(EXIT_FAILURE);
133 }
134
135 // IPC_RMID
136 printf("\n");
137 printf("IPC_RMID:\n");
138 if (shmctl(shmid, IPC_RMID, NULL) == -1)
139 { // 获取共享内存段信息
140 perror("shmctl");
141 exit(EXIT_FAILURE);
142 }
143
144 // SHM_LOCK
145 printf("\n");
146 printf("SHM_LOCK:\n");
147 if (shmctl(shmid, SHM_LOCK, NULL) == -1)
148 { // 获取共享内存段信息
149 perror("shmctl");
150 exit(EXIT_FAILURE);
151 }
152
153 // SHM_UNLOCK
154 printf("\n");
155 printf("SHM_UNLOCK:\n");
156 if (shmctl(shmid, SHM_UNLOCK, NULL) == -1)
157 { // 获取共享内存段信息
158 perror("shmctl");
159 exit(EXIT_FAILURE);
160 }
161 }