#include #include #include #include #include #include int main (int ac, char **av) { int segs, size, proc, rmpr; unsigned long long iter; pid_t pid; if (ac < 6) { printf ("usage: shmtst segs size proc iter rm%%\n"); exit (1); } segs = atoi (av[1]); size = atoi (av[2]); proc = atoi (av[3]); iter = atoi (av[4]); rmpr = atoi (av[5]); iter = 1 << iter; printf ("using %d segs of size %d (%llu iterations)\n", segs, size, iter); while (-- proc) { if ((pid = fork()) > 0) { printf ("started process %d\n", (int) pid); } else { break; } } srandom (getpid()); while (iter--) { key_t key; int seg; char *ptr, *p; key = random() % segs +1; if ((seg = shmget (key, size, IPC_CREAT| 0600)) == -1) { perror("shmget"); if (errno != EIDRM) exit (1); continue; } if (0) sched_yield(); if ((ptr = shmat (seg, 0, 0)) == (char *) -1) { perror ("shmat"); continue; } for (p = ptr; p < ptr + size; p += 4097) *p = (char) p; for (p = ptr; p < ptr + size; p += 4097) if (*p != (char)p) printf ("*p(%i) != p(%i)\n", (int)*p, (int)p); if (shmdt (ptr) != 0) { perror("shmdt"); exit (1); } if (random () % 100 < rmpr && shmctl (seg, IPC_RMID, NULL) == -1) perror("shmctl IPC_RMID"); } }