12.2 mmap、munmap和msync函数
1.接口
#include <sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset);
int munmap(void *addr,size_t len);
int msync(void *addr,size_t len,int flags);//同步内存映射文件与内存映射区
- mmap返回值:
- 描述符fd所映射到内存区的起始地址
- 说明
- 映射之后不用write或read了,可以简化代码
- 可以作为一种进程间共享内存的方式
- 下面是一个与信号灯一起实现进程间通信的例子
#include "unpipc.h"
struct shared {
sem_t mutex; /* the mutex: a Posix memory-based semaphore */
int count; /* and the counter */
} shared;
int main(int argc, char **argv)
{
int fd, i, nloop;
struct shared *ptr;
if (argc != 3)
err_quit("usage: incr3 <pathname> <#loops>");
nloop = atoi(argv[2]);
/* 4open file, initialize to 0, map into memory */
fd = Open(argv[1], O_RDWR | O_CREAT, FILE_MODE);
Write(fd, &shared, sizeof(struct shared));
ptr = Mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
//ptr = Mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,
// MAP_SHARED | MAP_ANON, -1, 0);//匿名内存映射
Close(fd);
/* 4initialize semaphore that is shared between processes */
Sem_init(&ptr->mutex, 1, 1);
setbuf(stdout, NULL); /* stdout is unbuffered */
if (Fork() == 0) { /* child */
for (i = 0; i < nloop; i++) {
Sem_wait(&ptr->mutex);
printf("child: %d\n", ptr->count++);
Sem_post(&ptr->mutex);
}
exit(0);
}
/* 4parent */
for (i = 0; i < nloop; i++) {
Sem_wait(&ptr->mutex);
printf("parent: %d\n", ptr->count++);
Sem_post(&ptr->mutex);
}
exit(0);
}
12.6 访问内存映射的对象
-
1.不出问题
访问内存映射区及文件内存页最后一页的剩余部分
-
2.SIGBUS
超出文件内存页但未超过映射区
-
3.SIGSEGV
上述两个区域都超过了