ipc_shm.c revision 7230d0a38862a286776aedd2e8b6fe86f5891e59
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_STAT, %p\\) += 0\n", id, &ds); 19 20 int max = shmctl(0, SHM_INFO, &ds); 21 if (max < 0) 22 goto fail; 23 printf("shmctl\\(0, SHM_INFO, %p\\) += %d\n", &ds, max); 24 25 rc = shmctl(id, SHM_STAT, &ds); 26 if (rc != id) { 27 /* 28 * In linux < v2.6.24-rc1 the first argument must be 29 * an index in the kernel's internal array. 30 */ 31 if (-1 != rc || EINVAL != errno) 32 goto fail; 33 printf("shmctl\\(%d, SHM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds); 34 } else { 35 printf("shmctl\\(%d, SHM_STAT, %p\\) += %d\n", id, &ds, id); 36 } 37 38 rc = 0; 39done: 40 if (shmctl(id, IPC_RMID, 0) < 0) 41 return 1; 42 printf("shmctl\\(%d, IPC_RMID, 0\\) += 0\n", id); 43 return rc; 44 45fail: 46 rc = 1; 47 goto done; 48} 49