您的位置:首页 > 其它

小记——内存映射

2016-07-18 18:03 106 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: