Linux使用mmap读取内容,完虐read操作

mmap是Linux系统调用,用于将文件或设备内容映射到进程的虚拟内存空间,实现直接读写。参数包括映射起点、长度、保护模式、标志、文件描述符和偏移量。映射类型如MAP_SHARED和MAP_PRIVATE决定数据同步方式。munmap用于释放内存映射区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mmap的man原型解释:

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

int munmap(void *start, size_t length);

简单就是将文件内容映射到内存中,然后直接从内存中进行读写。

start   指向对应的内存起始地址,设置为NULL代表由系统自行分配处理
length  映射多大区域到内存
prot    映射区域的保护方式,比如:
	PROT_EXEC  可执行
	PROT_READ  可读取
	PROT_WRITE 可写入
	PROT_NONE  不能存取  
flags   映射区域的各种特性,比如:
	MAP_FIXED      如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正
	MAP_SHARED     对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。
	MAP_PRIVATE    对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。
	MAP_ANONYMOUS  建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
	MAP_DENYWRITE  只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
	MAP_LOCKED     将映射区域锁定住,这表示该区域不会被置换(swap)。
fd      映射区的文件描述符
offset  偏移

测试代码:

#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 const *argv[])
{
	int fd = -1;
	void *start = NULL;
	struct stat sb = {'\0'};

	fd = open("/etc/passwd", O_RDONLY); /* open "/etc/passwd" file for map. */
	
	fstat(fd,&sb); /* get file size. */
	
	start = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
	
	if(start == MAP_FAILED) /* map failed. */
	{	
		return;
	}

	printf("\033[43;31m%s\033[0m\r\n",start);

	munmap(start, sb.st_size); /* release map memory. */

	close(fd);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值