小记——内存映射

来源:互联网 发布:物联网编程技术 编辑:程序博客网 时间:2024/05/21 07:08

1. 将文件映射到内存

#include <sys/mman.h>void * mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset);


2. 获得页面大小

#include <unistd.h>long sysconf (int name);long page_size = sysconf (_SC_PAGESIZE);OR#include <unistd.h>int getpagesize (void);

3. 解除映射

#include <sys/mman.h>int munmap (void *addr, size_t len);

4. 调整映射内存的大小
#define _GNU_SOURCE#include <sys/mman.h>void * mremap (void *addr, size_t old_size, size_t new_size, unsigned long flags);


5. 改变保护模式
#include <sys/mman.h>int mprotect (const void *addr, size_t len, int prot);


6. 同步内存映射到文件

#include <sys/mman.h>int msync (void *addr, size_t len, int flags);
==>例程:

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>int main (int argc, char *argv[]){struct stat sb;off_t len;char *p;int fd;if (argc < 2) {fprintf (stderr, "usage: %s <file>\n", argv[0]);return 1;}fd = open (argv[1], O_RDONLY);if (fd == −1) {perror ("open");return 1;}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;} p = 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 (len = 0; len < sb.st_size; len++)putchar (p[len]);if (munmap (p, sb.st_size) == −1) {perror ("munmap");return 1;}return 0;}


0 0
原创粉丝点击