파일 메모리 매핑

Juni and ING·2020년 8월 25일
0

매핑 요청

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

인자

addr

매핑되어 반환될 주소값을 직접 지정하여 요청
요청이 가능하면, 지정한 주소값으로 반환하고 불가능하면 커널이 임의의 주소값으로 반환함.

단, flags에 MAP_FIXED가 Set되어 있으면 요청 불가능할 경우에 실패값을 반환

length

매핑할 Byte수

prot

제어 권한

  • PROT_EXEC
    실행 권한
  • PROT_READ
    읽기 권한
  • PROT_WRITE
    쓰기 권한
  • PROT_NONE

flags

매핑 설정

  • 프로세스 간 파일 공유 설정
    • MAP_SHARED
      공유 OK
    • MAP_PRIVATE
      공유 NO
  • MAP_FIXED
    "인자 addr로 지정한 주소값 아니면 매핑 안하겠다."라는 의미

fd

파일 디스크립터

offset

오프셋값

반환값

성공 시

매핑된 주소값

실패 시

MAP_FAILED


매핑 해제

#include <sys/mman.h>

int munmap(void *addr, size_t length);

인자

addr

해제할 매핑주소값

length

매핑을 해제할 Byte수

반환값

성공 시

0

실패 시

-1


예제

struct info_t {
   char name[64];
   int age;
};

static void display_info(void)
{
   int fd = -1, totalCount;
   struct info_t *pInfo;
   struct stat statBuf;
   
   fd = open("file", O_RDONLY);
   if(fd < 0){
      perror("open() FAIL\n");
      goto EXCEPTION;
   }
   
   if(fstat(fd, &statBuf) < 0){
      perror("fstat() FAIL\n");
      goto EXCEPTION;
   }
   
   pInfo = (struct info_t *)
         (mmap(NULL, statBuf.st_size, PROT_READ, MAP_SHARED, fd, 0));
   if(pInfo == MAP_FAILED){
      perror("mmap() FAIL\n");
      goto EXCEPTION;
   }
   
   totalCount = statBuf.st_size / sizeof(struct info_t);
   for(register int idx = 0; idx < totalCount; idx++){
      printf("[%d] Name(%s), Age(%d)\n", idx, pInfo[idx].name, pInfo[idx].age);
   }
   
   if(munmap(fd, statBuf.st_size) < 0){
     perror("munmap FAIL\n"); 
   }
   
   close(fd);
   
   return;
   
EXCEPTION:
   if(fd >= 3)   close(fd);
   return;
}
profile
인기는 없지만 그래도 임베디드를 사랑하는 한 개발자

0개의 댓글