| /* 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; |
| } |