内存地址的处理操作
memchr 函数
函数原型
:
void *memchr(const void *str, int c, size_t n)
描述
:
在参数 str
所指向的内存的前
n
个字节中搜索第一次出现值
c
(值
c
和
str[]
相同类型)的位置。
返回值
:
该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回NULL。
备注
:
无
memcmp 函数
函数原型
:
int memcmp(const void *str1, const void *str2, size_t n)
描述
:
把 str1
和
str2
的前
n
个字节进行比较。
返回值
:
如果返回值 < 0
,则表示
str1
小于
str2
。
如果返回值 > 0
,则表示
str1
大于
str2
。
如果返回值 = 0
,则表示
str1
等于
str2
。
备注
:
无
memcpy 函数
函数原型
:
void *memcpy(void *dest, const void *src, size_t n)
描述
:
从 src
复制
n
个字节到
dest
。
返回值
:
该函数返回一个指向目标存储区 str1
的指针。
备注
:
无
memmove 函数
函数原型
:
void *memmove(void *dest, const void *src, size_t n)
描述
:
另一个用于从 src
复制
n
个字符到
dest
的函数。
返回值
:
该函数返回一个指向目标存储区 str1
的指针。
备注
:
在重叠内存块这方面,memmove()
是比
memcpy()
更安全的方法。如果目标区域和源区域有重叠的话,memmove()
能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy()
函数功能相同。
memset 函数
函数原型
:
void *memset(void *str, int c, size_t n)
描述
:
复制 c
到参数
str
所指向的内存的前
n
个字节。
返回值
:
该值返回一个指向存储区 str
的指针。
备注
:
常用于清空内存区的操作
bzero 函数
函数原型
:
void bzero(void *s, size_t n);
描述
:
将 s
的前
n
个字节置零
返回值
:
无
备注
:
不支持的所有系统,
移植性不强,建议使用
memset
代替
获取内存分页大小函数 getpagesize
头文件
:
#include <unistd.h>
函数原型
:
size_t getpagesize(void);
描述
:
返回内存页的大小
返回值
:
返回内存页的大小
备注
:
无
内存映射函数 mmap
头文件
:
#include <sys/mman.h>
函数原型
:
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
描述
:
因为文件的读写操作没有内存的读写操作来的方便,所以 mmap()
用来将某个文件内容映射到内存中,
对该内存区域的存取即是直接对该文件内容的读写
参数描述
:
addr
:
指向欲对应的内存起始地址,通常设为
NULL
,代表让系统自动选定地址,对应成功后该地址会返回
length:
映射的内存字节大小
port:
代表映射区域的保护方式,有下列组合:
PROT_EXEC 映射区域可被执行。
PROT_READ 映射区域可被读取。
PROT_WRITE 映射区域可被写入。
PROT_NONE 映射区域不能存取。
flags:
设置映射区域的特性:
MAP_FIXED 如果参数 addr
所指的地址无法成功建立映射时
,
则放弃映射,不对地址做修正。通常不建议设置
MAP_SHARED 对应射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享,
建议设置
MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的"
写入时复制" (copy on write)
对此区域作的任何修改都不会写回原来的文件内容。
MAP_ANONYMOUS 建立匿名映射,
此时会忽略参数
fd,
不涉及文件
,
而且映射区域无法和其他进程共享。
MAP_DENYWRITE 只允许对应射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)
。
fd:
文件描述符
offset:
文件映射的偏移量,通常设置为
0
,代表从文件最前方开始对应,
offset
必须是分页大小的整数倍
返回值
:
若映射成功则返回映射区的内存起始地址,否则返回 MAP_FAILED(-1)
,错误原因存于errno 中
备注
:
无
解除映射函数 munmap
头文件
:
#include <sys/mman.h>
函数原型
:
int munmap(void *addr, size_t length);
描述
:
解除 addr
内存的映射关系
参数说明
:
addr:映射内存的地址
length:
映射区字节大小
返回值
:
如果解除映射成功则返回 0
,否则返回-
1
备注
:
无
回写磁盘函数 msync
头文件
:
#include <sys/mman.h>
函数原型
:
int msync(void *addr, size_t length, int flags);
描述
:
进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用
munmap
()
后才执行该操作,可以通过调用
msync()
函数来实现磁盘文件内容与共享内存区中的内容一致,
即同步操作
.
参数说明:
addr:文件映射到进程空间的地址
len:映射空间的大小
flags:刷新的参数设置,可以取值
MS_ASYNC/ MS_SYNC/ MS_INVALIDATE
MS_ASYNC
(
异步
):
调用会立即返回,不等到更新的完成
MS_SYNC(同步)
:
调用会等到更新完成之后返回
MS_INVALIDATE
(
通知使用该共享区域的进程,数据已经改变
):
在共享内容更改之后,使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值
返回值
:
成功则返回 0
,否则返回-
1