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에 모든게 나와있음.
==============================================================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #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 <fromfile> <tofile>\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 */ </tofile></fromfile></fcntl.h></string.h></stdlib.h></stdio.h> |
1 2 3 4 5 6 7 8 9 | 실행 후 결과 화면 $ ./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 |
'프로그래밍 > System program' 카테고리의 다른 글
멀티스레드에 관하여 2 (0) | 2013.04.22 |
---|---|
멀티스레드에 관한 글 (0) | 2013.04.22 |