Linux C 函式參考 記憶體控制

2021-05-24 00:07:30 字數 4450 閱讀 6599

//今天把這部分【linux c函式庫詳解】chap3 記憶體分配函式 看了一下。

以下為內容

calloc(配置記憶體空間) 

相關函式  malloc,free,realloc,brk

表頭檔案  #include

定義函式  void *calloc(size_t nmemb,size_t size);

函式說明  calloc()用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙個元素的指標。這和使用下列的方式效果相同:malloc(nmemb*size);不過,在利用calloc()配置記憶體時會將記憶體內容初始化為0。

返回值  若配置成功則返回一指標,失敗則返回null。

範例  /* 動態配置10個struct test 空間*/

#include

struct test

int a[10];

char b[20];

main()

struct test *ptr=calloc(sizeof(struct test),10);

free(釋放原先配置的記憶體) 

相關函式  malloc,calloc,realloc,brk

表頭檔案  #include

定義函式  void free(void *ptr);

函式說明  引數ptr為指向先前由malloc()、calloc()或realloc()所返回的記憶體指標。呼叫free()後ptr所指的記憶體空間便會被收回。假若引數ptr所指的記憶體空間已被收回或是未知的記憶體位址,則呼叫free()可能會有無法預期的情況發生。若引數ptr為null,則free()不會有任何作用。

getpagesize(取得記憶體分頁大小) 

相關函式  sbrk

表頭檔案  #include

定義函式  size_t getpagesize(void);

函式說明  返回一分頁的大小,單位為位元組(byte)。此為系統的分頁大小,不一定會和硬體分頁大小相同。

返回值  記憶體分頁大小。附加說明在intel x86 上其返回值應為4096bytes。

範例  #include

main()

printf(「page size = %d/n」,getpagesize( ) );

malloc(配置記憶體空間) 

相關函式  calloc,free,realloc,brk

表頭檔案  #include

定義函式  void * malloc(size_t size);

函式說明  malloc()用來配置記憶體空間,其大小由指定的size決定。

返回值  若配置成功則返回一指標,失敗則返回null。

範例  void p = malloc(1024); /*配置1k的記憶體*/

mmap(建立記憶體對映) 

相關函式  munmap,open

表頭檔案  #include

#include

定義函式  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

#include

#include

#include

#include

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 :x :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

#include

定義函式  int munmap(void *start,size_t length);

函式說明  munmap()用來取消引數start所指的對映記憶體起始位址,引數length則是欲取消的記憶體大小。當程序結束或利用exec相關函式來執行其他程式時,對映記憶體會自動解除,但關閉對應的檔案描述詞時不會解除對映。

返回值  如果解除對映成功則返回0,否則返回-1,錯誤原因存於errno中錯誤**einval

引數  start或length 不合法。

範例  參考mmap()

Linux C 函式參考 日期時間

asctime 將時間和日期以字串格式表示 相關函式 time,ctime,gmtime,localtime 表頭檔案 include 定義函式 char asctime const struct tm timeptr 函式說明 asctime 將引數timeptr所指的tm結構中的資訊轉換成真實世...

linux c 記憶體相關函式

calloc 配置記憶體空間 相關函式 malloc,free,realloc,brk 表頭檔案 include 定義函式 void calloc size t nmemb,size t size 函式說明 calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙...

Linux C語言庫函式參考 nice

函 數 名 nice 調整程序執行的優先順序 函式原型 int nice int inc 相關標頭檔案 unistd.h 函式說明 在linux中,程序執行的優先順序分為 20 19等40個級別,其中,數值越小執行優先順序越高,數值越大執行優先順序越低。顯而易見,優先順序 20的執行優先順序最高,優...