sizeof():
太復(fù)雜了随橘,淚奔疲恢;
void *memcpy(void *dest, const void *src, size_t n);
memcpy函數(shù)的功能是從源src所指的內(nèi)存地址的起始位置開始拷貝n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。
memset(void *s,int ch,size_t n);
將s所指向的某一塊內(nèi)存中的前n個(gè) 字節(jié)的內(nèi)容全部設(shè)置為ch指定的ASCII值, 第一個(gè)值為指定的內(nèi)存地址,塊的大小由第三個(gè)參數(shù)指定署照,這個(gè)函數(shù)通常為新申請的內(nèi)存做初始化工作, 其返回值為指向s的指針吗浩。
zmalloc.c中:
#define zmalloc malloc
#define zrealloc realloc
#define zcalloc(x) calloc(x,1)
#define zfree free
malloc:
malloc調(diào)用形式為(類型*)malloc(size):在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長度為“size”字節(jié)的連續(xù)區(qū)域建芙,返回該區(qū)域的首地址。malloc分配的內(nèi)存是位于堆中的,并且沒有初始化內(nèi)存的內(nèi)容(可能有臟數(shù)據(jù))懂扼,因此基本上malloc之后禁荸,調(diào)用函數(shù)memset來初始化這部分的內(nèi)存空間
calloc:
calloc調(diào)用形式為(類型)calloc(n,size):在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域阀湿,返回首地址屡限,即在內(nèi)存中總計(jì)申請nsize字節(jié)大小的連續(xù)地址空間。 calloc會(huì)初始化這部分的內(nèi)存炕倘,設(shè)置為0;
realloc:
調(diào)用形式為 void* realloc(void* ptr, unsigned newsize); realloc的作用給一個(gè)已經(jīng)分配了地址的指針重新分配空間,參數(shù)ptr為原有的空間地址翰撑,newsize是重新申請的地址長度
strcasecmp:
函數(shù)定義: int strcasecmp (const char *s1, const char *s2);
函數(shù)說明 strcasecmp()用來比較參數(shù)s1和s2字符串罩旋,比較時(shí)會(huì)自動(dòng)忽略大小寫的差異啊央。
返回結(jié)果 若參數(shù)s1和s2字符串相等則返回0。s1大于s2則返回大于0 的值涨醋,s1 小于s2 則返回小于0的值瓜饥。
getrlimit&setrlimit:
函數(shù)定義:getrlimit(int resource,&limit)
函數(shù)說明:獲取(getrlimit)&設(shè)定(setrlimit)資源使用限制;
struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit)
RLIMIT_NOFILE:指定比進(jìn)程可打開的最大文件描述詞大一的值浴骂,超出此值乓土,將會(huì)產(chǎn)生EMFILE錯(cuò)誤。
struct rlimit {
rlim_t rlim_cur; //soft limit
rlim_t rlim_max; //hard limit
};
rlim_cur是指內(nèi)核所能支持的資源上限溯警,對應(yīng)ulimit -n的值趣苏;rlim_max對應(yīng)ulimit -n -H的值;
wait3&wait4:
pid_t wait3 ( int *status, int option, struct rusage *ru );
pid_t wait4 ( pid_t pid, int *status, int option, struct rusage *ru );
wait3等待所有的子進(jìn)程梯轻;
wait4可以像waitpid一樣指定要等待的子進(jìn)程:pid>0表示子進(jìn)程ID食磕;pid=0表示當(dāng)前進(jìn)程組中的子進(jìn)程;pid=-1表示等待所有子進(jìn)程喳挑;pid<-1表示進(jìn)程組ID為pid絕對值的子進(jìn)程彬伦。
fork():
fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程, 相當(dāng)于克隆了一個(gè)自己。
在語句fpid=fork()之前伊诵,只有一個(gè)進(jìn)程在執(zhí)行這段代碼单绑,但在fork之后,就變成兩個(gè)進(jìn)程在執(zhí)行了曹宴,這兩個(gè)進(jìn)程的幾乎完全相同搂橙,將要執(zhí)行的下一條語句都是if(fpid<0)……
為什么兩個(gè)進(jìn)程的fpid不同呢,這與fork函數(shù)的特性有關(guān)浙炼。fork調(diào)用的一個(gè)奇妙之處就是它僅僅被調(diào)用一次份氧,卻能夠返回兩次,它可能有三種不同的返回值弯屈,我們可以通過fork返回的值來判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程:
1)在父進(jìn)程中蜗帜,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID;
2)在子進(jìn)程中资厉,fork返回0厅缺;
3)如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值宴偿;
參考:http://www.cnblogs.com/jeakon/archive/2012/05/26/2816828.html
getpid():
定義函數(shù):pid_t getpid(void);
函數(shù)說明:getpid ()用來取得目前進(jìn)程的進(jìn)程識別碼湘捎,許多程序利用取到的此值來建立臨時(shí)文件, 以避免臨時(shí)文件相同帶來的問題 窄刘。
范例
#include <unistd.h>
int main()
{
printf("pid=%d\n", getpid());
return 0;
}
snprintf:
函數(shù)定義:int snprintf(char *str, size_t size, const char *format, ...);
函數(shù)說明:
將可變個(gè)參數(shù)(...)按照format格式化成字符串窥妇,然后將其復(fù)制到str中
(1) 如果格式化后的字符串長度 < size,則將此字符串全部復(fù)制到str中娩践,并給其后添加一個(gè)字符串結(jié)束符('\0')活翩;
(2) 如果格式化后的字符串長度 >= size烹骨,則只將其中的(size-1)個(gè)字符復(fù)制到str中,并給其后添加一個(gè)字符串結(jié)束符('\0')材泄,返回值為欲寫入的字符串長度沮焕。。
函數(shù)返回值:若成功則返回欲寫入的字符串長度拉宗,若出錯(cuò)則返回負(fù)值峦树。
read&write:
讀函數(shù)定義: ssize_t read(int fd,void *buf,size_t nbyte)
讀函數(shù)說明:read函數(shù)是負(fù)責(zé)從fd中讀取內(nèi)容保存到buf中.成功時(shí),read返回實(shí)際所讀的字節(jié)數(shù),如果返回的值是0,表示已經(jīng)讀到文件的結(jié)束了.小于0表示出現(xiàn)了錯(cuò)誤.
寫函數(shù)定義:ssize_t write(int fd,const void *buf,size_t nbytes)
寫函數(shù)說明:write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入文件描述符fd.成功時(shí)返回寫的字節(jié)數(shù).失敗時(shí)返回-1. 并設(shè)置errno變量. 在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述符寫時(shí)有倆種可能.
1)write的返回值大于0,表示寫了部分或者是全部的數(shù)據(jù).
2)返回的值小于0,此時(shí)出現(xiàn)了錯(cuò)誤.我們要根據(jù)錯(cuò)誤類型來處理. 如果錯(cuò)誤為EINTR表示在寫的時(shí)候出現(xiàn)了中斷錯(cuò)誤.
如果為EPIPE表示網(wǎng)絡(luò)連接出現(xiàn)了問題(對方已經(jīng)關(guān)閉了連接).
ftruncate:
函數(shù)定義:int ftruncate(int fd, off_t length)
函數(shù)說明:ftruncate()會(huì)將參數(shù)fd指定的文件大小改為參數(shù)length指定的大小。參數(shù)fd為已打開的文件描述詞旦事,而且必須是以寫入模式打開的文件魁巩。如果原來的文件件大小比參數(shù)length大,則超過的部分會(huì)被刪去族檬;
fsync與fdatasync:
一般情況下歪赢,對硬盤(或者其他持久存儲(chǔ)設(shè)備)文件的write操作,更新的只是內(nèi)存中的頁緩存(page cache)单料,而臟頁面不會(huì)立即更新到硬盤中埋凯,而是由操作系統(tǒng)統(tǒng)一調(diào)度,如由專門的flusher內(nèi)核線程在滿足一定條件時(shí)(如一定時(shí)間間隔扫尖、內(nèi)存中的臟頁達(dá)到一定比例)內(nèi)將臟頁面同步到硬盤上(放入設(shè)備的IO請求隊(duì)列)白对。
因?yàn)閣rite調(diào)用不會(huì)等到硬盤IO完成之后才返回,因此如果OS在write調(diào)用之后换怖、硬盤同步之前崩潰甩恼,則數(shù)據(jù)可能丟失。雖然這樣的時(shí)間窗口很小沉颂,但是對于需要保證事務(wù)的持久化(durability)和一致性(consistency)的數(shù)據(jù)庫程序來說条摸,write()所提供的“松散的異步語義”是不夠的,通常需要OS提供的同步IO(synchronized-IO)原語來保證铸屉;
fsync的功能是確保文件fd所有已修改的內(nèi)容已經(jīng)正確同步到硬盤上钉蒲,該調(diào)用會(huì)阻塞等待直到設(shè)備報(bào)告IO完成。fdatasync的功能與fsync類似彻坛,但是僅僅在必要的情況下才會(huì)同步metadata