/*
void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
//该函数把一个文件或一个posix共享内存区对象映射到调用进程的进程。
1.start:一般可以为NULL;
2.length:映射的字节大小;
3.prot:对映射存储的权限访问(PROT_NONE:不可访问;PROT_READ:可读;
PROT_WRITE:可写;PROT_EXEC:可执行);
4.flags:MAP_FIXED、MAP_SHARED(对内存的操作同样影响文件)、MAP_PRIVATE
5.文件描述附
6.要偏移的位置(SEEK_SET、SEEK_CUR、SEEK_END)
int munmap(void *start, size_t length);
//该函数用于取消映射
*/
001 | #include <sys/types.h> |
002 | #include <sys/stat.h> |
003 | #include <fcntl.h> |
004 | #include <stdio.h> |
005 | #include <sys/mman.h> |
006 | #include <string.h> |
007 | #include <errno.h> |
008 | #include <unistd.h> |
009 |
010 | /* |
011 | void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset); |
012 | //该函数把一个文件或一个posix共享内存区对象映射到调用进程的进程。 |
013 | 1.start:一般可以为NULL; |
014 | 2.length:映射的字节大小; |
015 | 3.prot:对映射存储的权限访问(PROT_NONE:不可访问;PROT_READ:可读; |
016 | PROT_WRITE:可写;PROT_EXEC:可执行); |
017 | 4.flags:MAP_FIXED、MAP_SHARED(对内存的操作同样影响文件)、MAP_PRIVATE |
018 | 5.文件描述附 |
019 | 6.要偏移的位置(SEEK_SET、SEEK_CUR、SEEK_END) |
020 |
021 | int munmap(void *start, size_t length); |
022 | //该函数用于取消映射 |
023 | */ |
024 |
025 | #define FILENAME1 "./lhw1" |
026 | #define FILENAME2 "./lhw2" |
027 | #define OPEN_FLAG O_RDWR|O_CREAT |
028 | #define OPEN_MODE 00777 |
029 | #define FILE_SIZE 4096*4 |
030 |
031 | static int my_mmap( int dst, int src) |
032 | { |
033 | int ret = -1; |
034 | void * add_src = NULL; |
035 | void * add_dst = NULL; |
036 | struct stat buf = {0}; |
037 |
038 | //获取打开文件的详细信息(主要要取得读文件的大小) |
039 | ret = fstat(src, &buf); |
040 | if (-1 == ret) |
041 | { |
042 | perror ( "fstat failed: " ); |
043 | goto _OUT; |
044 | } |
045 | //映射源文件的存储区 |
046 | add_src = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, src, SEEK_SET); |
047 | if (NULL == add_src) |
048 | { |
049 | perror ( "mmap src failed: " ); |
050 | goto _OUT; |
051 | } |
052 |
053 | //lseek dst(制造文件空洞,使其有一定大小,没有大小会出错) |
054 | ret = lseek(dst, buf.st_size, SEEK_SET); |
055 | if (-1 == ret) |
056 | { |
057 | perror ( "lseek dst faile: " ); |
058 | goto _OUT; |
059 | } |
060 | //write dst |
061 | ret = write(dst, "w" , 1); |
062 | if (-1 == ret) |
063 | { |
064 | perror ( "write dst faile: " ); |
065 | goto _OUT; |
066 | } |
067 |
068 | //映射目标文件的存储区 |
069 | add_dst = mmap(NULL, buf.st_size, PROT_WRITE, MAP_SHARED, dst, SEEK_SET); |
070 | if (NULL == add_dst) |
071 | { |
072 | perror ( "mmap src failed: " ); |
073 | goto _OUT; |
074 | } |
075 |
076 | //memcpy 将源文件内存add_src的内容拷贝到目标文件add_dst,通过内存共享 |
077 | memcpy (add_dst, add_src, buf.st_size); |
078 | |
079 | //取消映射 |
080 | ret = munmap(add_src, buf.st_size); |
081 | if (-1 == ret) |
082 | { |
083 | perror ( "munmap src faile: " ); |
084 | goto _OUT; |
085 | } |
086 | ret = munmap(add_dst, buf.st_size); |
087 | if (-1 == ret) |
088 | { |
089 | perror ( "munmap dst faile: " ); |
090 | goto _OUT; |
091 | } |
092 |
093 | _OUT: |
094 | return ret; |
095 | } |
096 |
097 | int main( void ) |
098 | { |
099 | int ret = -1; |
100 | int fd1 = -1; |
101 | int fd2 = -1; |
102 |
103 | //open fd1 |
104 | fd1 = open(FILENAME1, OPEN_FLAG, OPEN_MODE); |
105 | if (-1 == (ret = fd1)) |
106 | { |
107 | perror ( "open fd1 failed: " ); |
108 | goto _OUT; |
109 | } |
110 | //write fd1 |
111 | ret = write(fd1, "howaylee" , sizeof ( "howaylee" )); |
112 | if (-1 == ret) |
113 | { |
114 | perror ( "write failed: " ); |
115 | goto _OUT; |
116 | } |
117 | //open fd2 |
118 | fd2 = open(FILENAME2, OPEN_FLAG, OPEN_MODE); |
119 | if (-1 == (ret = fd2)) |
120 | { |
121 | perror ( "open fd2 failed: " ); |
122 | goto _OUT; |
123 | } |
124 | //mmap |
125 | my_mmap(fd2, fd1); |
126 |
127 | _OUT: |
128 | return ret; |
129 | } |