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