Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174341
  • 博文数量: 44
  • 博客积分: 2762
  • 博客等级: 少校
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-04 19:19
文章分类
文章存档

2011年(28)

2010年(16)

我的朋友

分类: C/C++

2010-10-05 13:45:14

下面是来自mmap的manpage的源代码



#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
    char *addr;
    int fd;
    struct stat sb;
    off_t offset, pa_offset;
    size_t length;
    ssize_t s;

    if (argc < 3 || argc > 4) {
        fprintf(stderr, "%s file offset [length]\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    fd = open(argv[1], O_RDONLY);
    if (fd == -1)
        handle_error("open");

    if (fstat(fd, &sb) == -1) /* To obtain file size */
        handle_error("fstat");

    offset = atoi(argv[2])

***************************

/*
C语言库函数名: atoi
功 能: 把字符串转换成整型数*/

*****************************


    pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
        /* offset for mmap() must be page aligned */

/*

这句研究了一下,是取得内存页的长度然后乘以offset,这样就可以与mmap的offset值匹配。

*/

    if (offset >= sb.st_size) {
        fprintf(stderr, "offset is past end of file\n");
        exit(EXIT_FAILURE);
    }

    if (argc == 4) {
        length = atoi(argv[3]);
        if (offset + length > sb.st_size)
            length = sb.st_size - offset;
                /* Canaqt display bytes past end of file */

    } else { /* No length arg ==> display to end of file */
        length = sb.st_size - offset;
    }

    addr = mmap(NULL, length + offset - pa_offset, PROT_READ,
                MAP_PRIVATE, fd, pa_offset);

/*

(length + offset - pa_offset)为内存映射的长度,因为pa_offset是内存页的首地址,所以offset-pa_offset就是从首地址开始的长度。再加上length,就是全部要映射的内容。addr仍然是当前内存块的首地址。

*/
    if (addr == MAP_FAILED)
        handle_error("mmap");

    s = write(STDOUT_FILENO, addr + offset - pa_offset, length);

/*

这句就是从当前内存块中,offset位置开始,到length长度结束的这段数据写入到STDOUT_FILENO文件中。

*/

    if (s != length) {
        if (s == -1)
            handle_error("write");

        fprintf(stderr, "partial write");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
} /* main */


阅读(1293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~