파일 을 메모리 에 표시 하 는 방법

2501 단어
실제 사례
4. 567917. 일부 바 이 너 리 파일 에 접근 할 때 파일 을 메모리 에 투사 하여 무 작위 로 접근 할 수 있 기 를 바 랍 니 다 (예 를 들 어 framebuffer 장치 파일)
4. 567917. 일부 내장 장치, 레지스터 는 메모리 주소 공간 에 주소 가 지정 되 어 있 습 니 다. 우 리 는/dev/mem 의 특정한 범 위 를 매 핑 하여 이 레지스터 에 접근 할 수 있 습 니 다
4. 567917. 여러 프로 세 스 가 같은 파일 을 비 추 면 프로 세 스 통신 의 목적 을 실현 할 수 있 습 니 다
솔 루 션: 표준 라 이브 러 리 에서 mmap 모듈 의 mmap () 함 수 를 사용 합 니 다. 열 린 파일 설명자 가 필요 합 니 다.
주: 본 사례 는 Linux 시스템 에서 실험 합 니 다.
셸 에서 우 리 는 dd 명령 을 통 해 데이터 가 0 이 고 크기 가 1M 인 바 이 너 리 파일 을 만 들 었 습 니 다. od - x 명령 을 통 해 16 진법 으로 이 파일 을 보 았 습 니 다.
rookie@rookie ~/Desktop $ dd if=/dev/zero of=demo.bin bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.007549 s, 139 MB/s

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000

우 리 는 셸 에 다음 명령 을 입력 하여 바 이 너 리 파일 을 메모리 에 표시 합 니 다.
>>> f = open('demo.bin', 'r+b')
>>> import mmap
>>> m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
>>> type(m)

>>> m[0]
'\x00'
>>> m[10:20]
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> m[0] = '\x88'

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0088 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000

위 명령 에서 저 희 는 Python 에 내 장 된 open () 함 수 를 사용 하여 파일 설명 자 를 얻 고 f. fileno () 를 사용 하여 파일 설명 자 를 가 져 옵 니 다.그 밖 에 os 모듈 의 open () 함 수 를 사용 하여 파일 설명 자 를 얻 을 수 있 습 니 다.mmap () 함수 의 두 번 째 매개 변수 0 은 전체 파일 을 메모리 에 표시 하고 세 번 째 매개 변수 mmap. ACCESSWRITE 는 쓰기 권한 을 가 져 옵 니 다.
mmap () 함 수 를 호출 하면 mmap 의 대상 m 를 얻 을 수 있 습 니 다.우 리 는 이 대상 m 를 이용 하여 목록 과 같은 조작 을 할 수 있다.
주: mmap () 함수 에 offset 인자 가 하나 더 있 습 니 다. 맵 파일 의 한 영역 을 지정 하지만 메모리 페이지 크기 의 정수 배 여야 합 니 다.
>>> m = mmap.mmap(f.fileno(), mmap.PAGESIZE*8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE*4)
>>> m[:0x1000] = '\xaa' * 0x1000

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0088 0000 0000 0000 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

상기 조작 을 통 해 우 리 는 메모리 에서 데 이 터 를 수정 하 는 동시에 파일 의 데 이 터 를 수정 했다.그래서 우 리 는 파일 을 메모리 에 비 추 는 목적 을 달성 했다.
주: 이 부분 은 본인 도 약간 대 추 를 통째로 삼 키 고 있 습 니 다. 지나 가 는 사내 가 잘못된 방향 을 가르쳐 주 셨 으 면 좋 겠 습 니 다. 감사합니다!

좋은 웹페이지 즐겨찾기