mmap能夠通過將磁碟上的檔案對映到記憶體中,通過指標訪問檔案內容。這樣能夠達到快速處理檔案。
包含的標頭檔案為#include ,主要使用的函式有:
//開啟檔案,獲取檔案描述符
int open(const char *pathname, int flags);
//獲取檔案位元組數
int stat(const char *restrict path, struct stat *restrict buf);
//使用mmap將對應的檔案對映到本程序記憶體
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
//解除隱射才能釋放記憶體空間
int munmap(void *addr, size_t length);
//關閉檔案
int close(int fd);
注意:
使用完mmap之後,要記得使用munmap函式釋放記憶體空間,否則就會產生記憶體洩露,而且此記憶體洩露不易發現,使用valgrind也沒能查出來。
以下以我處理pcap檔案的函式為例,展示mmap的使用方法,示例**片段如下:
#include #include #include #include #include #include int parseapcapfile(char * file_name)
//get file bytes
//file_size = lseek(pcap_fd, 0, seek_end);
stat(file_name,&statbuf);
file_size = statbuf.st_size;
if(file_size < 24)
//get mmap pointer
origin_data = (char *)mmap(null, file_size, prot_read, map_private, pcap_fd, 0);
data = origin_data;
printf("file size is: %ld\n", file_size);
//if(strlen(data) < 24 || 0xa1b2c3d4 != *(uint32_t*)data)
data += 24;
while (data - origin_data < file_size)
/** start to parse the ip header
* get the ip header
*/iphdr = *(struct ip_hdr *)flow_ptr;
// print the ip header
//printipinfo(iphdr);
parseipheader(iphdr);
//next flow
data += (pkt_hdr.caplen + 16);
}//free mmap space
munmap(origin_data, file_size);
//close file
close(pcap_fd);
if (data - origin_data == file_size) else
}
使用mmap複製檔案
mmap可以將相應的檔案描述的內容對映到記憶體中,讀取記憶體就相當於讀取檔案了。下面這個例子,注意看不同的檔案使用的不同的flag。include include include include include include include include define file mode s i...
使用mmap實現檔案的拷貝
mmap與munmap函式介紹 include include void mmap void start,size t length,int prot,int flag,int fd,off t offset 返回 若成功時則返回對映區域的指標,若出錯則為map failed 1 start 最好從...
使用libpcap庫過濾pcap檔案中的資料報
工作需要,要對pcap檔案中的資料報進行過濾,只保留普通埠的tcp udp資料報。結果如下圖 如下 include include include include include define ether addr len 6 mac位址長度 位元組 乙太網頭 struct sniff ethern...