ipc_shm.c revision 0a6af9b0a45553587954ef306d56e78ac1f4f363
1#include <stdio.h> 2#include <errno.h> 3#include <sys/shm.h> 4 5int 6main(void) 7{ 8 int rc, id; 9 struct shmid_ds ds; 10 11 id = shmget(IPC_PRIVATE, 1, 0600); 12 if (id < 0) 13 return 77; 14 printf("shmget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id); 15 16 if (shmctl(id, IPC_STAT, &ds)) 17 goto fail; 18 printf("shmctl\\(%d, (IPC_64\\|)?IPC_STAT, \\{shm_perm=\\{uid=%u, gid=%u, " 19 "mode=%#o, key=%u, cuid=%u, cgid=%u\\}, shm_segsz=%u, shm_cpid=%u, " 20 "shm_lpid=%u, shm_nattch=%u, shm_atime=%u, shm_dtime=%u, " 21 "shm_ctime=%u\\}\\) += 0\n", 22 id, (unsigned) ds.shm_perm.uid, (unsigned) ds.shm_perm.gid, 23 (unsigned) ds.shm_perm.mode, (unsigned) ds.shm_perm.__key, 24 (unsigned) ds.shm_perm.cuid, (unsigned) ds.shm_perm.cgid, 25 (unsigned) ds.shm_segsz, (unsigned) ds.shm_cpid, 26 (unsigned) ds.shm_lpid, (unsigned) ds.shm_nattch, 27 (unsigned) ds.shm_atime, (unsigned) ds.shm_dtime, 28 (unsigned) ds. shm_ctime); 29 30 int max = shmctl(0, SHM_INFO, &ds); 31 if (max < 0) 32 goto fail; 33 printf("shmctl\\(0, (IPC_64\\|)?SHM_INFO, %p\\) += %d\n", &ds, max); 34 35 rc = shmctl(id, SHM_STAT, &ds); 36 if (rc != id) { 37 /* 38 * In linux < v2.6.24-rc1 the first argument must be 39 * an index in the kernel's internal array. 40 */ 41 if (-1 != rc || EINVAL != errno) 42 goto fail; 43 printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds); 44 } else { 45 printf("shmctl\\(%d, (IPC_64\\|)?SHM_STAT, %p\\) += %d\n", id, &ds, id); 46 } 47 48 rc = 0; 49done: 50 if (shmctl(id, IPC_RMID, NULL) < 0) 51 return 1; 52 printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id); 53 return rc; 54 55fail: 56 rc = 1; 57 goto done; 58} 59