内存映像IO-Linux下C编程指南

内存映像是通过将文件映射到内存中去以提高文件读取速度。

此时可以使用指针快速访问文件中的数据

1.

使用的函数

要将外部存储的文件映射到内存中,需要使用

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

此时,若start不为NULL会将文件映射到此位置,但是不保证一定能成功;

length表示占用内存映像的大小,字节记;

prot表示内存映像的安全属性,可选项为:

PROT_EXEC              //被映射的内存可能可执行
PROT_NONE              // 被映射的内存不可访问
PROT_READ                //被映射的内存可读
PROT_WRITE            //被映射的内存可写

flag表示内存映像的标志

MAP_FIXED                //若无法在start建立映像,则出错返回
MAP_REIVATE            //对内存的改动不反映到外存文件中
MAP_SHARED            //将内存中的改动保存到外存文件中

off_t表示映像的内容距离文件头的偏移量

调用失败返回-1,否则返回映像内存起始地址

****注意需要在进程中打开文件才可以进行映射***

2.

修改内存映像的保护值prot

int protect(const void *addr,size_t length,int prot);

成功会返回0,出错返回-1,且会将errno置为它。

3.

将内存映像写入外存

int msync(const void *start,size_t length,int flag);

flag的参数选项为:

MS_ASYNC            //调度一个写操作并返回
MS_INVALIDATE       //将映像到相同文件的映像无效以便使其更新为新数据
MS_SYNC             //完成写操作后函数返回

4.

修改映像内存大小

void *mremap(void *old_addr,size_t old_length,size_t new_length,unsigned long flag)

参数flag表示是否在需要时移动映像的位置

调用成功返回映像新地址,否则返回错误值-1

时间: 2024-10-14 12:36:31

内存映像IO-Linux下C编程指南的相关文章

内存管理-Linux下C编程指南

1. 静态内存 编译的时候预申请的内存,不需要自己管理,所属函数执行完毕后自动回收 缺陷: 类似下面的函数会出错: char *uppr(char *oldstring) { char newstring[100]; ... return newstring; } 因为函数执行完毕后字符数组new已经被销毁了,指针指向的位置当然就不是正确的地址. 此函数可以通过以下方式解决: void uppr(char *old,char *new) { ... } 可以将两个字符数组传入,然后将更改写回ne

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

linux下多线程编程

最近研究mysql源码,各种锁,各种互斥,好在我去年认真学了<unix环境高级编程>, 虽然已经忘得差不多了,但是学过始终是学过,拿起来也快.写这篇文章的目的就是总结linux 下多线程编程,作为日后的参考资料. 本文将介绍linux系统下多线程编程中,线程同步的各种方法.包括: 互斥量(mutex) 读写锁 条件变量 信号量 文件互斥 在介绍不同的线程同步的方法之前,先简单的介绍一下进程和线程的概念, 它们的优缺点,线程相关的API,读者——写者问题和哲学家就餐问题. 基础知识 1. 进程和

Linux 下互联网络编程的基础知识

2019-10-07 关键字:Linux 网络编程基础 TCP/IP 协议里有两种不同的协议: 1.TCP协议 用于检测网络传输中的差错. 2.IP协议 用于对不同网络进行互联. 简单说就是 TCP 负责纠错,IP 负责传输. 网络体系结构: 网络体系结构就是将复杂的网络通信过程按照一定的规则进行分层,从而能使整个的网络通信过程更加清晰. 这一分层的核心思想有二: 1.每一层实现不同的功能,并对其上层做透明传输. 2.每一层都会使用到其下一层所提供的服务,并对其上一层提供服务. 早期的网络体系结

Linux下socket编程基本知识

本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linux网络编程 Linux网络编程|人工智能物联网 1.概念 1.1套接字(socket) Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段. Linux中的网络编程通过socket接口实现,socket既是

根据《linux兵书》目录 在kali上操作 第8章 Linux下的编程

第8章  浑水摸鱼:Linux下的编程 175 8.1  Linux下常用的开发工具 176 8.1.1  GCC 176 8.1.2  CVS 176 8.1.3  Perl 176 8.1.4  Linux上的Delphi--Kylix 177 8.2  Linux下的Vi文本编辑器 177 8.2.1  Vi编辑器介绍 178 8.2.2  启动Vi编辑器 179 8.2.3  显示Vi中的行号 180 8.2.4  光标移动操作 181 8.2.5  屏幕命令 182 8.2.6  文本

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下Socket编程的端口问题( Bind error: Address already in use )

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

Linux下Shell编程

Linux的shell编程 1.什么是shell? 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序. shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.一般的Linux系统都将bash作为默认的shell. 2.几种流行的shell 目前流行的shell有ash.bash.ksh.csh.zsh等,可以用下面的命令来查看she

linux 下 poll 编程

poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int poll(struct pollfd *fdarray, unsigned long nfds, int timeout) 第一个参数指向结构数组第一个元素的指针,每个数组都是一个 pollfd 结构iouyonghu制定额是某个给定描述符的条件. struct pollfd { int fd; short eve