mmap.c
@@ -0,0 +1,75 @@
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <error.h>
+#include <errno.h>
+#include <getopt.h>
+#include <string.h>
+#include <sys/mman.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int fd;
+ void *addr;
+ int read_write = 0, write_only = 0, private = 0;
+ int prot, flags;
+
+ const struct option options[] = {
+ { "read-write", no_argument, &read_write, 1 },
+ { "write-only", no_argument, &write_only, 1 },
+ { "private", no_argument, &private, 1 },
+ { NULL, 0, NULL, 0 }
+ };
+
+ while (1)
+ {
+ c = getopt_long (argc, argv, "", options, NULL);
+ if (c == '?')
+ return EXIT_FAILURE;
+ if (c == -1)
+ break;
+ }
+
+ if (optind != argc - 1)
+ error (EXIT_FAILURE, 0, "please specify one file name");
+
+ if (read_write)
+ flags = O_RDWR;
+ else if (write_only)
+ flags = O_WRONLY;
+ else
+ flags = O_RDONLY;
+
+ fd = open (argv[optind], flags | O_NOCTTY);
+ if (fd == -1)
+ error (EXIT_FAILURE, errno, "failed to open");
+
+ if (read_write)
+ prot = PROT_READ|PROT_WRITE;
+ else if (write_only)
+ prot = PROT_WRITE;
+ else
+ prot = PROT_READ;
+
+ flags = MAP_FILE;
+ if (private)
+ flags |= MAP_PRIVATE;
+ else
+ flags |= MAP_SHARED;
+
+ addr = mmap (NULL, 4096, prot, flags, fd, 0);
+ if (addr == MAP_FAILED)
+ error (EXIT_FAILURE, errno, "failed to mmap");
+
+ fprintf (stderr, "mmaped at %p\n", addr);
+ fflush (stderr);
+
+ if (!write_only)
+ printf ("%s\n", addr);
+ if (read_write || write_only)
+ strcpy(addr, "well hello friends! :^)\n");
+
+ return 0;
+}
\ No newline at end of file