?? 03.html
字號:
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> void p = malloc(1024); /*配置1k的內存*/<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc29></a></font> </div>
</td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> <br>
mmap(建立內存映射) </font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 相關函數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> munmap,open<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> #include <unistd.h><br>
#include <sys/mman.h><br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 定義函數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> void *mmap(void *start,size_t
length,int prot,int flags,int fd,off_t offsize);<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 函數(shù)說明 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> mmap()用來將某個文件內容映射到內存中,對該內存區(qū)域的存取即是直接對該文件內容的讀寫。參數(shù)start指向欲對應的內存起始地址,通常設為NULL,代表讓系統(tǒng)自動選定地址,對應成功后該地址會返回。參數(shù)length代表將文件中多大的部分對應到內存。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 參數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> prot代表映射區(qū)域的保護方式有下列組合<br>
PROT_EXEC 映射區(qū)域可被執(zhí)行<br>
PROT_READ 映射區(qū)域可被讀取<br>
PROT_WRITE 映射區(qū)域可被寫入<br>
PROT_NONE 映射區(qū)域不能存取<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 參數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> flags會影響映射區(qū)域的各種特性<br>
MAP_FIXED 如果參數(shù)start所指的地址無法成功建立映射時,則放棄映射,不對地址做修正。通常不鼓勵用此旗標。<br>
MAP_SHARED對映射區(qū)域的寫入數(shù)據(jù)會復制回文件內,而且允許其他映射該文件的進程共享。<br>
MAP_PRIVATE 對映射區(qū)域的寫入操作會產(chǎn)生一個映射文件的復制,即私人的“寫入時復制”(copy on write)對此區(qū)域作的任何修改都不會寫回原來的文件內容。<br>
MAP_ANONYMOUS建立匿名映射。此時會忽略參數(shù)fd,不涉及文件,而且映射區(qū)域無法和其他進程共享。<br>
MAP_DENYWRITE只允許對映射區(qū)域的寫入操作,其他對文件直接寫入的操作將會被拒絕。<br>
MAP_LOCKED 將映射區(qū)域鎖定住,這表示該區(qū)域不會被置換(swap)。<br>
在調用mmap()時必須要指定MAP_SHARED 或MAP_PRIVATE。參數(shù)fd為open()返回的文件描述詞,代表欲映射到內存的文件。參數(shù)offset為文件映射的偏移量,通常設置為0,代表從文件最前方開始對應,offset必須是分頁大小的整數(shù)倍。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> 若映射成功則返回映射區(qū)的內存起始地址,否則返回MAP_FAILED(-1),錯誤原因存于errno
中。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 錯誤代碼 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> EBADF 參數(shù)fd 不是有效的文件描述詞<br>
EACCES 存取權限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入。<br>
EINVAL 參數(shù)start、length 或offset有一個不合法。<br>
EAGAIN 文件被鎖住,或是有太多內存被鎖住。<br>
ENOMEM 內存不足。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> /* 利用mmap()來讀取/etc/passwd 文件內容*/<br>
#include<sys/types.h><br>
#include<sys/stat.h><br>
#include<fcntl.h><br>
#include<unistd.h><br>
#include<sys/mman.h><br>
main()<br>
{<br>
int fd;<br>
void *start;<br>
struct stat sb;<br>
fd=open(“/etc/passwd”,O_RDONLY); /*打開/etc/passwd*/<br>
fstat(fd,&sb); /*取得文件大小*/<br>
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);<br>
if(start= = MAP_FAILED) /*判斷是否映射成功*/<br>
return;<br>
printf(“%s”,start);<br>
munma(start,sb.st_size); /*解除映射*/<br>
closed(fd);<br>
}<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 執(zhí)行 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> root : x : 0 : root : /root :
/bin/bash<br>
bin : x : 1 : 1 : bin : /bin :<br>
daemon : x : 2 : 2 :daemon : /sbin<br>
adm : x : 3 : 4 : adm : /var/adm :<br>
lp : x :4 :7 : lp : /var/spool/lpd :<br>
sync : x : 5 : 0 : sync : /sbin : bin/sync :<br>
shutdown : x : 6 : 0 : shutdown : /sbin : /sbin/shutdown<br>
halt : x : 7 : 0 : halt : /sbin : /sbin/halt<br>
mail : x : 8 : 12 : mail : /var/spool/mail :<br>
news : x :9 :13 : news : /var/spool/news :<br>
uucp : x :10 :14 : uucp : /var/spool/uucp :<br>
operator : x : 11 : 0 :operator : /root:<br>
games : x : 12 :100 : games :/usr/games:<br>
gopher : x : 13 : 30 : gopher : /usr/lib/gopher-data:<br>
ftp : x : 14 : 50 : FTP User : /home/ftp:<br>
nobody : x :99: 99: Nobody : /:<br>
xfs :x :100 :101 : X Font Server : /etc/xll/fs : /bin/false<br>
gdm : x : 42 :42 : : /home/gdm: /bin/bash<br>
kids : x : 500 :500 :/home/kids : /bin/bash<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><br>
<font face='宋體' size='2'><a name=linuxc30></a></font> </div>
</td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> <br>
</font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> <br>
munmap(解除內存映射) </font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 相關函數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> mmap<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 表頭文件 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> #include<unistd.h><br>
#include<sys/mman.h><br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 定義函數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> int munmap(void *start,size_t
length);<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 函數(shù)說明 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> munmap()用來取消參數(shù)start所指的映射內存起始地址,參數(shù)length則是欲取消的內存大小。當進程結束或利用exec相關函數(shù)來執(zhí)行其他程序時,映射內存會自動解除,但關閉對應的文件描述詞時不會解除映射。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 返回值 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> 如果解除映射成功則返回0,否則返回-1,錯誤原因存于errno中錯誤代碼EINVAL<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 參數(shù) </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> start或length 不合法。<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><font face='宋體' size='2'> 范例 </font> </div>
</td>
<td valign="top"> <font face='宋體' size='2'> 參考mmap()<br>
</font> </td>
</tr>
<tr>
<td valign="top" width="80">
<div align="right"><br>
</div>
</td>
</tr>
</table>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -