| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | /* Copyright (C) 2009 Mikael Lund Jepsen <mlj@iccc.dk> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */#include <errno.h>#include <fcntl.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/wait.h>#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))char shared_name[] = "/sharetest";int test_data[11] = {0,1,2,3,4,5,6,7,8,9,10};int main(void) {	int pfds[2];	pid_t pid;	int fd;	int test_data_fails = 0;	char *ptest_data;	unsigned int i;	char buf[30];	int rv;	pipe(pfds);	switch(pid = fork()) {	case -1:		perror("fork");		exit(1);	/* parent exits */	case 0:		/* Child */		/* wait for parent */		read(pfds[0], buf, 5);		fd =  shm_open(shared_name, O_RDWR, DEFFILEMODE);		if (fd == -1) {			perror("CHILD - shm_open(existing):");			exit(1);		} else {			ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0);			if (ptest_data != MAP_FAILED) {				for (i=0; i < ARRAY_SIZE(test_data); i++) {					if (ptest_data[i] != test_data[i]) {						printf("%-40s: Offset %d, local %d, shm %d\n", "Compare memory error", i, test_data[i], ptest_data[i]);						test_data_fails++;					}				}				if (test_data_fails == 0)					printf("%-40s: %s\n", "Compare memory", "Success");				munmap(ptest_data, sizeof(test_data));			}		}		exit(0);	default:		/* Parent */		fd = shm_open(shared_name, O_RDWR+O_CREAT+O_EXCL, DEFFILEMODE );		if (fd == -1) {			perror("PARENT - shm_open(create):");		} else {			if ((ftruncate(fd, sizeof(test_data))) == -1)			{				printf("%-40s: %s", "ftruncate", strerror(errno));				shm_unlink(shared_name);				return 0;			}			ptest_data = mmap(0, sizeof(test_data), PROT_READ + PROT_WRITE, MAP_SHARED, fd, 0);			if (ptest_data == MAP_FAILED)			{				perror("PARENT - mmap:");				if (shm_unlink(shared_name) == -1) {					perror("PARENT - shm_unlink:");				}				return 0;			}			for (i=0; i < ARRAY_SIZE(test_data); i++)				ptest_data[i] = test_data[i];			/* signal child */			write(pfds[1], "rdy", 5);			/* wait for child */			wait(&rv);			/* Cleanup */			munmap(ptest_data, sizeof(test_data));			if (shm_unlink(shared_name) == -1) {				perror("PARENT - shm_unlink:");			}		}	}	return 0;}
 |