1 /*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/mman.h>
13 #include <unistd.h>
14
15
16 int
main()17 main()
18 {
19 const char* fileName = "/tmp/mmap-resize-test-file";
20
21 // create file
22 printf("creating file...\n");
23 int fd = open(fileName, O_CREAT | O_RDWR | O_TRUNC, 0644);
24 if (fd < 0) {
25 fprintf(stderr, "Failed to open \"%s\": %s\n", fileName,
26 strerror(errno));
27 exit(1);
28 }
29
30 // write half a page
31 printf("writing data to file...\n");
32 char buffer[2048];
33 memset(buffer, 0xdd, sizeof(buffer));
34 if (write(fd, buffer, sizeof(buffer)) != (ssize_t)sizeof(buffer)) {
35 fprintf(stderr, "Failed to write to file!\n");
36 exit(1);
37 }
38
39 // map the page
40 printf("mapping file...\n");
41 void* address = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
42 if (address == MAP_FAILED) {
43 fprintf(stderr, "Failed to map the file: %s\n", strerror(errno));
44 exit(1);
45 }
46
47 // truncate the file
48 printf("truncating file...\n");
49 if (ftruncate(fd, 0) < 0) {
50 fprintf(stderr, "Failed to truncate the file: %s\n", strerror(errno));
51 exit(1);
52 }
53
54 // touch data
55 printf("touching no longer mapped data (should fail with SIGBUS)...\n");
56 *(int*)address = 42;
57
58 printf("Shouldn't get here!!!\n");
59
60 return 0;
61 }
62