mmap的使用及pcap檔案解析示例

2021-07-25 16:55:38 字數 1704 閱讀 4038

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...