Python將文件映射到內(nèi)存使用mmap.mmap()函數(shù)方式
如何將文件映射到內(nèi)存
實(shí)際案例
(1)在訪問(wèn)某些二進(jìn)制文件時(shí),希望能把文件映射到內(nèi)存中,可以實(shí)現(xiàn)隨機(jī)訪問(wèn)。(framebuffer設(shè)備文件)
(2)某些嵌入式設(shè)備,寄存器被編址到內(nèi)存地址空間,我們可以映射/dev/mem某范圍,去訪問(wèn)這些寄存器。
(3)如果多個(gè)進(jìn)程映射同一個(gè)文件,還能實(shí)現(xiàn)進(jìn)程通信的目的。
解決方案
使用標(biāo)準(zhǔn)庫(kù)中mmap模塊的mmap()函數(shù),它需要一個(gè)打開(kāi)的文件描述作為參數(shù)。
代碼演示
# 使用dd命令創(chuàng)建大小為1M的,每個(gè)字節(jié)都是0的二進(jìn)制文件demo.bin ~ % dd if=/dev/zero of=demo.bin bs=1024 count=1024 1024+0 records in 1024+0 records out 1048576 bytes transferred in 0.008838 secs (118644037 bytes/sec) # 以16進(jìn)制形式查看這個(gè)文件 ~ % od -x demo.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000 # 接下來(lái)對(duì)這個(gè)文件進(jìn)行映射
import mmap
'''
mmap.mmap函數(shù)介紹:
需要注意對(duì)于不同的平臺(tái)對(duì)這個(gè)函數(shù)使用稍有差別。
Windows: mmap(fileno, length[, tagname[, access[, offset]]])
Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])
fileno為文件描述符,并不是一個(gè)文件對(duì)象,文件描述符是由系統(tǒng)調(diào)用的open函數(shù)得到的,
系統(tǒng)調(diào)用的open函數(shù)在os.open(),也可以使用python的open函數(shù)
offset為指定映射區(qū)域,必須以頁(yè)對(duì)齊的
'''
# b為二進(jìn)制模式,r+為讀寫權(quán)限
f = open('demo.bin', 'r+b')
# 得到文件描述符
print(f.fileno())
# 做映射,映射區(qū)域長(zhǎng)度為0映射整個(gè)文件,訪問(wèn)權(quán)限寫
mn = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
# m為mmap對(duì)象類似于數(shù)組一樣的操作
print(type(mn))
print(mn[0])
print(mn[10:20])
# 對(duì)文件進(jìn)行寫操作
mn[0] = 88
# 字符串長(zhǎng)度和切片長(zhǎng)度保持一致
mn[4:8] = b'\xff' * 4
# 設(shè)置offset跳過(guò)4個(gè)頁(yè),并且映射8個(gè)頁(yè)
mn2 = mmap.mmap(f.fileno(), mmap.PAGESIZE * 8, access=mmap.ACCESS_WRITE,
offset=mmap.PAGESIZE * 4)
# 對(duì)切片進(jìn)行修改
mn2[:0x1000] = b'\xaa' * 0x1000修改文件映射內(nèi)存的內(nèi)容并查看 # 修改映射地址內(nèi)容 # 查看[0]、[4:8]和[:0x1000]內(nèi)容修改 ~ % od -x demo.bin 0000000 0058 0000 ffff ffff 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa * 0050000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python簡(jiǎn)單實(shí)現(xiàn)自動(dòng)刪除目錄下空文件夾的方法
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)自動(dòng)刪除目錄下空文件夾的方法,涉及Python針對(duì)文件與目錄的讀取、判斷、刪除等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Python+pandas編寫命令行腳本操作excel的tips詳情
這篇文章主要介紹了Python+pandas編寫命令行腳本操作excel的tips詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
Python入門開(kāi)發(fā)教程 windows下搭建開(kāi)發(fā)環(huán)境vscode的步驟詳解
大家都知道Python是跨平臺(tái)的,它可以運(yùn)行在Windows、Mac和各種Linux/Unix系統(tǒng)上。在Windows上寫Python程序,放到Linux上也是能夠運(yùn)行的,今天給大家分享Python開(kāi)發(fā)環(huán)境搭建vscode的步驟,一起看看吧2021-07-07
利用Python爬蟲(chóng)實(shí)現(xiàn)搶購(gòu)某寶秒殺商品
這篇文章主要介紹了利用Python爬蟲(chóng)實(shí)現(xiàn)搶購(gòu)某寶秒殺商品,文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Python-split()函數(shù)實(shí)例用法講解
在本篇文章里小編給大家整理的是一篇關(guān)于Python-split()函數(shù)實(shí)例用法講解,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12
Python實(shí)現(xiàn)的概率分布運(yùn)算操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的概率分布運(yùn)算操作,涉及Python概率運(yùn)算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2017-08-08

