diff --git a/chp4/mmap.c b/chp4/mmap.c new file mode 100644 index 0000000..11c9843 --- /dev/null +++ b/chp4/mmap.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + + if (argc < 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 1; + } + + int fd = open(argv[1], O_RDONLY); + if (fd == -1) { + perror("open"); + return 1; + } + + struct stat sb; + if (fstat(fd, &sb) == -1) { + perror("fstat"); + return 1; + } + + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s is not a file\n", argv[1]); + return 1; + } + + char *p = (char *)mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (p == MAP_FAILED) { + perror("mmap"); + return 1; + } + + if (close(fd) == -1) { + perror("close"); + return 1; + } + + for (int len = 0; len < sb.st_size; len++) { + putchar(p[len]); + } + + if (munmap(p, sb.st_size) == -1) { + perror("munmap"); + return 1; + } + + return 0; +}