mmap 사용시 알아둘 사항 (버스오류)
Programming/System 2010. 5. 31. 22:45
mmap 이라하면... seek 같은 귀찬은짓 안하고 파일에서 메모리로 사상 받은다음에,
그 메모리를 조작하면 자동(?) 으로 그 (메모리에 변경된 내용)이 파일에 저장되는 참 편한 넘이져.
(꼭 파일 디스크립터가 있어야하는건 아니지만.......)
근데 문제는,,,저 int files의 파일/파일 디스크립터를 open 할떄 주의 해야하는게...
NAME
mmap - map pages of memory
SYNOPSIS
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags. int fildes, off_t off);
mmap - map pages of memory
SYNOPSIS
#include <sys/mman.h>
void *mmap(void *addr, size_t len, int prot, int flags. int fildes, off_t off);
mmap을 사용할때는 Target 이 되는 파일이 write할 길이보다 커야한다. 는거........
(그러므로 (아래서도 적었지만) 당연히 파일크기가 0가 되서는 안됨)
만약 그렇지 않다면 "버스 오류" 라는 메세지를 출력하고 프로그럄이 종료되어버리는 문제가 생긴다.
O_TRUNC 같은 옵션을 open 함수 사용할때 놓어서도 안되므로 주의 하도록 하자,
그니깐 정리하면.... "mmap은 쓸파일의 크기를 변경할수 없다" 는것..
혹 버스 오류가 나면 참고하도록하자.
joinc에 주의사항하나 정도는 적혀있을듯 했었는데.. 없었던거 같다 (아님 내가 제대로 안읽었던가)
kldp에는 비슷한 내용의 글타래가 올라왔던거 같으니깐 구글에서 찾아보세염.
이걸 왜 했냐면......----------------------------
euckr로 변환된 문서를 utf8로 적용하려고, iconv를 쓰다보니...문제가 생겼다
버퍼 크기가 작어서(euckr로 잡으니) 로케일이 변경되다가 말았던것....
저번엔 utf8->euckr로 변경할때는 어짜피 파일크기가 utf8크기가 크니깐, 그냥 utf8파일 크기를 버퍼 크기로 줘도
상관없었는데, 문제는 그 반대의 상황이 문제였던것...
그래서 메모리 사상을 써봐서 해결해 볼까.......... 해서 mmap을 쓸려고 하니깐....
뭐야... 이것도 결국 버퍼 크기 알아야 하잖아... 챗...
그냥 iconv 함수 쓸때 euckr파일크기 * 2 (사실 1.5배만 해도 충분하다고 하지만) 로 최대 버퍼 잡아서 넘겨버렸다..
(http://kldp.org/node/68263)
잘 되네 변환..
이제 터미널에서 글자폭을 알아야 할 차레...
(뭐 정안되면 UTF8용으로 글자폭 알아보던 함수를 다시 한번 수정해야겠다.
지금 만든건 CJK(한글, 한문, 히라/가타카나)는 글자폭을 제대로 알아오는데.............
러시아어(...) 같은건 제대로 못얻어 와서....... wscol인가.. 그건 왜 눅스에 없을까...)
에이 걍 터미널에서 삽질하지 말고 gtk로 ...?..
'Programming > System' 카테고리의 다른 글
gdb에서 core dump 디버깅 (2) | 2010.09.08 |
---|---|
gdb 에서 thread 생성/종료 메세지 안나오게 하기 (2) | 2010.08.18 |
FAT12과 FAT16의 부트레코드의 구성이 같은모양인가 보다 (2) | 2007.07.27 |
부트섹터에서 프로그램 실행시키기. (14) | 2007.07.21 |
압축플때 쓰는 쉘 스크립트 (4) | 2007.06.18 |