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;
}