亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python將文件映射到內(nèi)存使用mmap.mmap()函數(shù)方式

 更新時(shí)間:2024年02月10日 09:57:52   作者:AllardZhao  
這篇文章主要介紹了Python將文件映射到內(nèi)存使用mmap.mmap()函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何將文件映射到內(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+為讀寫(xiě)權(quán)限
f = open('demo.bin', 'r+b')
# 得到文件描述符
print(f.fileno())
# 做映射,映射區(qū)域長(zhǎng)度為0映射整個(gè)文件,訪問(wèn)權(quán)限寫(xiě)
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)行寫(xiě)操作
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)文章

最新評(píng)論