linux 清理内存的c函数,Linux C函数之内存配置函数
1. 配置和釋放內存
alloca: 配置內存空間
頭文件: stdlib.h
函數定義: void *alloc(size_t size);
說明: alloca()用來配置size個字節的內存空間, 然而和malloc/calloc不同的是, alloca()是從堆棧空間(stack)中配置內存, 因此在函數返回時會自動釋放此空間. 若成功返回指向配置內存首地址的指針, 失敗返回NULL.
calloc: 配置內存空間
頭文件: stdlib.h
函數定義: void *calloc(size_t nmemb, size_t size);
說明: calloc()用來配置nmemb個相鄰的內存單位, 每一單位的大小為size, 并返回指向第一個元素的指針. 這和使用下列的方式效果相同:malloc(nmemb * size); 不過, 在利用calloc()配置內存時會將內存內容初始化為0. 若配置成功則返回一指針, 失敗則返回NULL.
malloc: 配置內存空間
頭文件: stdlib.h
函數定義: void *malloc(size_t size);
說明: malloc()用來配置內存空間, 其大小由指定的size決定. 若成功返回一指針, 失敗返回NULL.
realloc: 更改已配置的內存空間
頭文件: stdlib.h
函數定義: void *realloc(void *ptr, size_t size);
說明: 參數ptr為指向先前由malloc(), calloc(), realloc()所返回的內存指針, 而參數size為新配置的內存大小, 其值可比原內存大或小. 若參數size值比原來小, 內存內容不會改變, 且返回的指針為原來內存的起始地址; 若比原來的大, 則realloc()不一定會返回原先的指針, 原來的內容雖然不會改變, 但新多出的內存則未設初值. 若是參數ptr為NULL, 此調用相當于malloc(size), 若參數size為0, 此調用相當于free(ptr). 若配置成功返回一指針, 失敗返回NULL.
free: 釋放原先配置的你存
頭文件: stdlib.h
函數定義: void free(void *ptr);
說明: 參數ptr為指向先前由malloc(), calloc()或realloc()所返回的內存指針. 調用free()后ptr所指的內存空間便會被收回. 假若參數ptr所指的內存空間已被收回或是未知的內存地址, 則調用free()可能會有無法預期的情況發生. 若參數ptr為NULL, 則free()不會有任何作用.
2. 建立和解除內存映射
mmap: 建立內存映射
頭文件: unistd.h, sys/mman.h
函數定義: void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
說明: mmap()用來將某個文件內容映射到內存中, 對該內存區域的存取即是直接對該文件內容的讀寫.
參數start指向欲對應的內存起始地址, 通常設為NULL, 代表讓系統自動選定地址, 對應成功后該地址會返回. 參數length代表將文件中多大的部分對應到內存. 參數prot代表映射區域的保護方式, 有下列組合:
PROT_EXEC 映射區域可被執行.
PROT_READ 映射區域可被讀取.
PROT_WRITE 映射區域可被寫入.
PROT_NONE 映射區域不能存取.
參數flags會影響映射區域的各種特性:
MAP_FIXED 如果參數start所指的地址無法成功建立映射時, 則放棄映射, 不對地址做修正. 通常不鼓勵用此旗標.
MAP_SHARED 對映射區域的寫入數據會復制回文件內, 而且允許其他映射該文件的進程共享.
MAP_PRIVATE 對映射區域的寫入操作會產生一個映射文件的復制, 即私人的"寫入時復制"(copy on write). 對此區域作的任何修改都不會寫回原來的文件內容.
MAP_ANONYMOUS 建立匿名映射. 此時會忽略參數fd, 不涉及文件, 而且映射區域無法和其他進程共享.
MAP_DENYWRITE 只允許對映射區域的寫入操作, 其他對文件直接寫入的操作將會被拒絕.
MAP_LOCKED 將映射區域鎖定住, 這表示該區域不會被置換(swap).
在調用mmap()時必須要指定MAP_SHARED或MAP_PRIVATE. 參數fd為open()返回的文件描述詞, 代表欲映射到內存的文件. 參數offset為文件映射的偏移量, 通常設置為0, 代表從文件最前方開始對應, offset必須是分頁大小的整數倍.
若映射成功則返回映射區的內存起始地址, 否則返回MAP_FAILED(-1), 錯誤原因存于errno中. 錯誤代碼:
EBADF 參數fd不是有效的文件描述詞.
EACCES 存取權限有誤. 如果是MAP_PRIVATE情況下文件必須可讀, 使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入.
EINVAL 參數 start、length或offset有一個不合法.
EAGAIN 文件被鎖住,或是有太多內存被鎖住.
ENOMEM 內存不足.
munmap: 解除內存映射
頭文件: unistd.h, sys/mman.h
函數定義: int munmap(void *start, size_t length);
說明: munmap()用來取消參數start所指的映射內存起始地址, 參數length則是欲取消的內存大小. 當進程結束或利用exec相關函數來執行其他程序時, 映射內存會自動解除, 但關閉對應的文件描述詞時不會解除映射.
如果解除映射成功則返回0, 否則返回-1, 錯誤原因存于errno中. EINVAL參數start或length不合法.
應用舉例: 利用mmap()來讀取/etc/passwd文件內容
#include #include #include #include #include #include int main(void)
{
int fd;
void *start;
struct stat sb;
fd = open("/etc/passwd", O_RDONLY);
fstat(fd, &sb);
start = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if(start == MAP_FAILED)
return -1;
printf("%s", start);
munmap(start, sb.st_size);
close(fd);
return 0;
}
運行結果: 略
3. 其它
brk: 改變數據字節的范圍
頭文件: stdlib.h
函數定義: int brk(void *end_data_segment);
說明: brk()用來依參數end_data_segment所指的數值設成新的數據字節范圍.若函數調用成功則返回0. 函數調用失敗則返回-1, 將errno設為ENOMEM.
sbrk: 增加程序可用的數據空間
頭文件: stdlib.h
函數定義: void *sbrk(ptrdiff_t increment);
說明: sbrk()用來增加程序可用的數據空間, 增加大小由參數increment決定. 若函數調用成功則返回 一指針, 指向新的內存空間. 函數調用失敗則返回-1, 將errno設為ENOMEM.
getsizepage: 取得內存分頁大小
頭文件: unistd.h
函數定義: size_t getpagesize(void);
說明: 返回內存一分頁的大小, 單位為字節(byte). 此為系統的分頁大小, 不一定會和硬件分頁大小相同. 在Intel x86上其返回值應為4096bytes.
總結
以上是生活随笔為你收集整理的linux 清理内存的c函数,Linux C函数之内存配置函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux otl oracle,lin
- 下一篇: 高通良心!aptx编解码面向AOSP开源