#include #include #include #include #include #include #include int main (int ac, char **av) { int segs, size, proc, rmpr; unsigned long long iter; pid_t pid; struct stat buf; 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--) { int seg, key; char name[20]; char *ptr, *p; key = random() % segs; sprintf (name, "my%d", key); if ((seg = shm_open (name, O_CREAT| O_RDWR , 0666)) == -1) { perror("shm_open"); exit (1); } if (ftruncate (seg, size) == -1) { perror ("ftruncate"); exit (2); } if ((ptr = mmap (0, size, PROT_READ|PROT_WRITE,MAP_SHARED, seg, 0)) == MAP_FAILED) { perror ("mmap"); exit (3); } 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 & 0xff); if (munmap (ptr, size) == -1) perror ("munmap"); if (close(seg) == -1) perror ("close"); if (random () % 100 < rmpr && shm_unlink (name) == -1) perror("shm_unlink"); } }