#define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include #include int main(void) { char tmpfname[256]; long page_size; void *pa; size_t len; int fd; pid_t child; char *ch; int exit_val; page_size = sysconf(_SC_PAGE_SIZE); len = page_size / 2; snprintf(tmpfname, sizeof(tmpfname), "testfile"); child = fork(); switch (child) { case 0: /* Create shared object */ unlink(tmpfname); fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR); if (fd == -1) { printf("Error at open(): %s\n", strerror(errno)); return 1; } if (ftruncate(fd, len) == -1) { printf("Error at ftruncate(): %s\n", strerror(errno)); return 1; } pa = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (pa == MAP_FAILED) { printf("Error at mmap(): %s\n", strerror(errno)); return 1; } /* Check the patial page is ZERO filled */ ch = pa + len + 1; if (*ch != 0) { printf("Test FAILED: " "The partial page at the end of an object " "is not zero-filled\n"); return 1; } /* Write the partial page */ *ch = 'b'; msync(pa, len, MS_SYNC); if (*ch != 'b') printf("nb: byte modified beyond EOF cleared after mysync\n"); munmap(pa, len); close(fd); return 0; case -1: printf("Error at fork(): %s\n", strerror(errno)); return 1; default: break; } wait(&exit_val); if (!(WIFEXITED(exit_val) && (WEXITSTATUS(exit_val) == 0))) { unlink(tmpfname); printf("Child exited abnormally\n"); return 1; } fd = open(tmpfname, O_RDWR, 0); // unlink(tmpfname); pa = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (pa == MAP_FAILED) { printf("Error at 2nd mmap(): %s\n", strerror(errno)); return 1; } ch = pa + len + 1; if (*ch == 'b') { printf("Test FAILED: Modification of the partial page " "at the end of an object is written out\n"); return 1; } close(fd); munmap(pa, len); printf("Test PASSED\n"); return 0; }