일종의 IPC 통신으로 사용가능하다. 매우 빠름.
출처 : 소스코드 http://www.cs.purdue.edu/homes/fahmy/cs503/mmap.txt
void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);
파일이나 디바이스를 응용 프로그램의 주소 공간 메모리에 대응시킨다.
1인자 => 시작 포인터 주소 (아래의 예제 참조)
2인자 => 파일이나 주소공간의 메모리 크기
3인자 => PROT 설정 (읽기, 쓰기, 접근권한, 실행)
4인자 => flags는 다른 프로세스와 공유할지 안할지를 결정한다.
5인자 => fd는 쓰거나 읽기용으로 열린 fd값을 넣어준다.
6인자 => offset은 0으로 하던지 알아서 조절한다.
int munmap(void* start, size_t length);
할당된 메모리 영역을 해제한다.
1인자 => 위에 mmap으로 지정된 포인터값 넣어주고
2인자 => 위에서 사용했던 length와 동일하게 넣어준다.
(왜냐면.. 할당했던거 동일하게 해제해야 하니깐..)
더 자세한 사항은 man page에 모든게 나와있음.
==============================================================
#include#include #include #include #include "sys/types.h" #include "sys/stat.h" #include "sys/mman.h" /* mmap() is defined in this header */ int main (int argc, char *argv[]) { int fdin, fdout; char *src, *dst; struct stat statbuf; if (argc != 3) { printf("usage: a.out \n"); return -1; } /* open the input file */ if ((fdin = open (argv[1], O_RDONLY)) < 0) { printf ("can't open %s for reading", argv[1]); return -2; } /* open/create the output file */ if ((fdout = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR)) < 0) { printf ("can't create %s for writing", argv[2]); return -2; } /* find size of input file */ if (fstat (fdin,&statbuf) < 0) { printf ("fstat error"); return -2; } /* go to the location corresponding to the last byte */ if (lseek (fdout, statbuf.st_size - 1, SEEK_SET) == -1) { printf ("lseek error"); return -2; } /* write a dummy byte at the last location */ if (write (fdout, "", 1) != 1) { printf ("write error"); return -2; } /* mmap the input file */ if ((src = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0)) == (caddr_t) -1) { printf ("mmap error for input"); return -2; } /* mmap the output file */ if ((dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdout, 0)) == (caddr_t) -1) { printf ("mmap error for output"); return -2; } /* this copies the input file to the output file */ memcpy (dst, src, statbuf.st_size); munmap(src, statbuf.st_size); munmap(dst, statbuf.st_size); return 0; } /* main */ /* The end of function */
실행 후 결과 화면 $ ./a.out test test_out $ ls -al drwxr-xr-x 2 jeon jeon 4096 Jul 17 08:39 . drwx------ 12 jeon jeon 4096 Jul 17 08:39 .. -rwxr-xr-x 1 jeon jeon 6410 Jul 17 08:39 a.out -rw-r--r-- 1 jeon jeon 1844 Jul 17 08:39 mmap.c -rw-r--r-- 1 jeon jeon 469 Jul 17 08:29 test -rw------- 1 jeon jeon 469 Jul 17 08:39 test_out
==============================================================
test라는 입력파일은 미리 생성하고
test_out은 위의 프로그램을 실행하고 생성된 파일이다.
생각보다 간단한것 같은데.
최대 어느정도까지 매핑시키는지는 추후에 해봐야겠다..
'Language > C' 카테고리의 다른 글
Unix Domain Socket 예제 (165) | 2012.07.23 |
---|---|
semget. semop, semctl 함수 예제 (14) | 2012.07.17 |
shmget/ shmat 함수 예제 (8) | 2012.07.13 |
C FAQ (포인터 증가 3) (155) | 2012.07.13 |
nmemb 의미 (153) | 2012.07.12 |