記憶體控制函數全集 Linux C

來源:互聯網
上載者:User


calloc(配置記憶體空間)
相關函數 malloc,free,realloc,brk
表標頭檔 #include <stdlib.h>
定義函數 void *calloc(size_t nmemb,size_t size);
函數說明 calloc()用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第一個元素的指標。這和使用下列的方式效果相同:malloc(nmemb*size);不過,在利用calloc()配置記憶體時會將記憶體內容初始化為0。
傳回值 若配置成功則返回一指標,失敗則返回NULL。
範例 /* 動態配置10個struct test 空間*/
#include<stdlib.h>
struct test
{
int a[10];
char b[20];
}
main()
{
struct test *ptr=calloc(sizeof(struct test),10);
}
 



free(釋放原先配置的記憶體)
相關函數 malloc,calloc,realloc,brk
表標頭檔 #include<stdlib.h>
定義函數 void free(void *ptr);
函數說明 參數ptr為指向先前由malloc()、calloc()或realloc()所返回的記憶體指標。調用free()後ptr所指的記憶體空間便會被收回。假若參數ptr所指的記憶體空間已被收回或是未知的記憶體位址,則調用free()可能會有無法預期的情況發生。若參數ptr為NULL,則free()不會有任何作用。
 



getpagesize(取得記憶體分頁大小)
相關函數 sbrk
表標頭檔 #include<unistd.h>
定義函數 size_t getpagesize(void);
函數說明 返回一分頁的大小,單位為位元組(byte)。此為系統的分頁大小,不一定會和硬體分頁大小相同。
傳回值 記憶體分頁大小。附加說明在Intel x86 上其傳回值應為4096bytes。
範例 #include <unistd.h>
main()
{
printf(“page size = %d/n”,getpagesize( ) );
}
 



malloc(配置記憶體空間)
相關函數 calloc,free,realloc,brk
表標頭檔 #include<stdlib.h>
定義函數 void * malloc(size_t size);
函數說明 malloc()用來配置記憶體空間,其大小由指定的size決定。
傳回值 若配置成功則返回一指標,失敗則返回NULL。
範例 void p = malloc(1024); /*配置1k的記憶體*/
 



mmap(建立記憶體映射)
相關函數 munmap,open
表標頭檔 #include <unistd.h>
#include <sys/mman.h>
定義函數 void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
函數說明 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 記憶體不足。
範例 /* 利用mmap()來讀取/etc/passwd 檔案內容*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/mman.h>
main()
{
int fd;
void *start;
struct stat sb;
fd=open(“/etc/passwd”,O_RDONLY); /*開啟/etc/passwd*/
fstat(fd,&sb); /*取得檔案大小*/
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(start= = MAP_FAILED) /*判斷是否映射成功*/
return;
printf(“%s”,start);
munma(start,sb.st_size); /*解除映射*/
closed(fd);
}
執行 root : x : 0 : root : /root : /bin/bash
bin : x : 1 : 1 : bin : /bin :
daemon : x : 2 : 2 :daemon : /sbin
adm : x : 3 : 4 : adm : /var/adm :
lp : x :4 :7 : lp : /var/spool/lpd :
sync : x : 5 : 0 : sync : /sbin : bin/sync :
shutdown : x : 6 : 0 : shutdown : /sbin : /sbin/shutdown
halt : x : 7 : 0 : halt : /sbin : /sbin/halt
mail : x : 8 : 12 : mail : /var/spool/mail :
news : x :9 :13 : news : /var/spool/news :
uucp : x :10 :14 : uucp : /var/spool/uucp :
operator : x : 11 : 0 :operator : /root:
games : x : 12 :100 : games :/usr/games:
gopher : x : 13 : 30 : gopher : /usr/lib/gopher-data:
ftp : x : 14 : 50 : FTP User : /home/ftp:
nobody : x :99: 99: Nobody : /:
xfs :100 :101 : X Font Server : /etc/xll/fs : /bin/false
gdm : x : 42 :42 : : /home/gdm: /bin/bash
kids : x : 500 :500 :/home/kids : /bin/bash
 



munmap(解除記憶體映射)
相關函數 mmap
表標頭檔 #include<unistd.h>
#include<sys/mman.h>
定義函數 int munmap(void *start,size_t length);
函數說明 munmap()用來取消參數start所指的映射記憶體起始地址,參數length則是欲取消的記憶體大小。當進程結束或利用exec相關函數來執行其他程式時,映射記憶體會自動解除,但關閉對應的檔案描述詞時不會解除映射。
傳回值 如果解除映射成功則返回0,否則返回-1,錯誤原因存於errno中錯誤碼EINVAL
參數 start或length 不合法。
範例 參考mmap()

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.