c语言mmap ) )函数:创建内存映射标头:
1 #包含#包含
定义函数: void*mmap(void*start,size_t length,int prot,int flags,int fd,off_t offsize );
函数说明: mmap ) )用于将文件内容映射到内存。 对该内存区域的访问是对文件内容的直接读写。
参数说明:
返回值:映射成功时返回映射区域的内存起始地址,否则返回map_failed(-1 ),错误原因保存在errno中。
错误代码:
EBADF参数fd不是有效的文件描述符。
EACCES访问权限错误。 对于MAP_PRIVATE,文件必须是可读的,PROT_WRITE及其文件必须是可写的才能使用MAP_SHARED。
EINVAL参数start、length或offset中存在错误。
EAGAIN文件已锁定或内存太多。
ENOMEM内存不足。
示例: mmap ) )读取/etc/passwd文件的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include
#包含
#包含
#包含
#包含
主()。
Int软盘;
void *start;
struct stat sb;
FD=open('/etc/passwd ',O_RDONLY ); /*打开/etc/passwd */
stat (软盘、sb ); /*获取文件大小*
start=mmap(null,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0 );
判断if(start==map_failed )/*映射是否成功(/
返回;
printf('%s ',start; mun ma (开始,sb.st_size ); /*取消映射*
Cosed (软盘;
}
执行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 root : x :03360 root :/root :/bin/bash
bin : x :1336013360133601: bin :/bin :
daemon : x :23360233602336023360 daemon :/sbin
ADM : x :43360 ADM :/var/ADM :
LP : x :4336073360 LP :/var/spool/lpd :
sync : x :5336003360 sync :/sbin : bin/sync :
shut down : x :6336003360 shut down :/sbin :/sbin/shut down
halt : x :7336003360 halt :/sbin :/sbin/halt
mail : x :83360123360 mail :/var/spool/mail 3360
news : x :933601: news :/var/spool/news :
UCP : x :103360143360 uucp :/var/spool/uucp :
operator : x :11336003360 operator :/root :
games : x :1233601003360 games :/usr/games :
gopher : x :1:303360 gopher :/usr/lib/gopher-data :
FTP : x :143360503360 ftpuser :/home/FTP :
nobody : x :993360993360 nobody :/:
xfs : x :1003360101: xfont server :/etc/xll/fs :/bin/false
GDM : x :423360423360336033603360/home/GDM :/bin/bash
kids : x :5003360500:/home/kids :/bin/bash
c语言munmap ) )函数:取消内存映射标头:
1 #包含#包含
定义函数:
1intmunmap(void*start,size_t length );
函数说明: munmap (用于取消参数start指向的映射内存的起始地址,参数length是要取消的内存的大小。 当进程终止或使用exec相关函数运行其他程序时,映射内存将自动清除,但关闭相应的文件描述符不会清除映射。
返回值:如果取消映射成功,则返回0,否则返回-1。 错误原因存储在errno中的错误代码EINVAL参数start或length无效。
示例: mmap (请参见