LINUX mmap 怎么关闭
时间: 2024-05-07 18:22:50 浏览: 169
使用 `munmap` 函数可以关闭 `mmap`。`munmap` 函数的原型如下:
```c
#include <sys/mman.h>
int munmap(void *addr, size_t length);
```
其中,`addr` 是映射的起始地址,`length` 是映射的长度。调用 `munmap` 函数后,内核会取消对映射区域的映射,并释放相关的资源。
例如,以下代码展示了如何使用 `munmap` 函数关闭 `mmap` 映射:
```c
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
// 使用映射区域...
munmap(addr, size); // 关闭映射
close(fd);
return 0;
}
```
相关问题
linux mmap
Linux的mmap是一种内存映射文件的方法,通过将一个文件或者其他对象映射到进程的地址空间,实现磁盘的地址和进程虚拟地址空间的一一对应关系。通过使用mmap系统调用,进程可以将同一个普通文件映射到它们的地址空间中,从而实现共享内存的效果。一旦文件被映射到进程的地址空间中,进程可以像访问普通内存一样对文件进行读写操作。
在Linux中,通过调用内核的mmap函数来进行内存映射,其函数原型为int mmap(struct file *filp, struct vm_area_struct *vma)。需要注意的是,这里的mmap是内核态的mmap,并非用户态的mmap。
下面是一个演示映射到物理内存的案例:
```cpp
#include <iostream>
#include <sys/mman.h>
#include <cstring>
#include <cerrno>
#include <cstdio>
using namespace std;
static const int SIZE = 4096;
int main() {
char *str = (char *)mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
// 注意MAP_PRIVATE和MAP_ANONYMOUS
// 建立映射
if (str == MAP_FAILED) {
printf("%s\n", strerror(errno));
return -2;
}
strcpy(str, "hello ksy");
puts(str);
// 用于取消映射
munmap(str, SIZE);
return 0;
}
```
以上代码使用mmap将一段物理内存映射到进程的地址空间中,然后将字符串"hello ksy"写入到这段映射的内存中,并
#### 引用[.reference_title]
- *1* *2* *3* [Linux下mmap](https://blog.csdn.net/qq_56999918/article/details/127070280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
linux mmap返回值
根据提供的引用内容,Linux中的mmap函数在成功执行时返回被映射区的指针,而在失败时返回MAP_FAILED(其值为(void *)-1),并且errno会被设置为相应的错误值。
以下是一个演示Linux mmap函数返回值的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("file.txt", O_RDWR);
if (fd == -1) {
perror("open");
exit(1);
}
off_t size = lseek(fd, 0, SEEK_END);
if (size == -1) {
perror("lseek");
exit(1);
}
void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
printf("mmap successful. Pointer: %p\n", ptr);
if (close(fd) == -1) {
perror("close");
exit(1);
}
return 0;
}
```
阅读全文