作者: 一字馬胡
轉(zhuǎn)載標志 【2018-03-27】
更新日志
日期 | 更新內(nèi)容 | 備注 |
---|---|---|
2018-03-27 | 回顧以前的知識 | link from csdn |
/這個函數(shù)可以將errno直接轉(zhuǎn)換為可讀的錯誤形式/
(1)琳袄、char* strerror(int errnum)
/這個函數(shù)將直接打印出errno當(dāng)前值所對應(yīng)的錯誤信息打印出來款筑,參數(shù)可以指定一個字符串辙诞,函數(shù)將這個字符串顯示在錯誤信息前面/
(2)奏赘、void perror(const char* msg)
/這個函數(shù)可以用來獲取主機名/
(3)南缓、int gethostname(char* name,size_t size)
/這個函數(shù)可以設(shè)置主機名/
(4)臀突、int sethostname(const char* name,size_t length)
/這個函數(shù)將返回操作系統(tǒng)和主機的信息,保存在參數(shù)info里面,那是一個結(jié)構(gòu)體/
(5)骆捧、int uname(struct utsname *info)
//-|structure define|-
struct utsname{
char sysname[];//os
char nodename[];//host name
char release[];//os version
char release[];//os version level
char machine[];//hardware type
};
/這個函數(shù)用于獲取系統(tǒng)當(dāng)前系統(tǒng)變量之值,參數(shù)為需要查看的系統(tǒng)變量/
(6)髓绽、long int sysconf(int parameter)
/這個函數(shù)用來獲取文件系統(tǒng)限制和選項/
(7)敛苇、long int pathconf(const char* pathname,int parameter)
/這個函數(shù)一樣用來獲取文件系統(tǒng)的限制和選項,只是需要提供的是文件描數(shù)字/
(8)顺呕、long int fpathconf(int filedes,int parameter)
/這個函數(shù)可以獲得當(dāng)前工作目錄/
(9)枫攀、int getcwd(char* buffer,size_t size)
/這個函數(shù)用來打開一個文件流/
(10)、FILE* fopen(const char* pathname,const char* opentype)
/這個函數(shù)用來關(guān)閉一個文件流/
(11)株茶、int fclose(FILE* stream)
/這個函數(shù)用來重新打開文件流/
(12)来涨、FILE* freopen(const char* pathname,const charopentype,FILE stream)
/這個函數(shù)用來讀取一個字符,并且強制轉(zhuǎn)換為int/
(13)启盛、int fgetc(FILE* stream)
/這個函數(shù)和fgetc一樣蹦掐,只是可以作為宏使用,而fgetc不可以/
(14)僵闯、int getc(FILE* stream)
/這個函數(shù)相當(dāng)于getc(stdin),也就是從標準輸入讀入/
(15)卧抗、int getchar(void)
/這個函數(shù)將int c強制轉(zhuǎn)換為unsigned char c,然后寫入stream/
(16)鳖粟、int fputc(int c,FILE* stream)
/可以用宏來實現(xiàn)社裆,其他和fputc一樣/
(17)、int putc(int c,FILE* stream)
/標準輸出向图,相當(dāng)于putc(stdout)/
(18)泳秀、int putchar(int c)
/這個函數(shù)將連續(xù)讀取count-1個字符,然后在末尾添加‘\0’,注意如果需要讀的字符多了张漂,那么就要多次調(diào)用/
(19)晶默、char* fgets(chars,int count,FILE stream)
/這個函數(shù)只從標準輸入讀取,功能和fgets一樣航攒,只是一次讀完/
(20)磺陡、char* gets(char* s)
/這個函數(shù)用來從流中讀入一行/
(21)、ssize_t getline(char** lineptr,size_t n,FILE* stream)
/這個函數(shù)可以自己指定一次讀入的終止符漠畜,如果指定為'\n'币他,那么就和getline一樣/
(22)、ssize_t getdelim(char** lineptr,int size_t n,int delimiter,FILE* stream)
/每次輸出一行/
(23)憔狞、int fputs(const char* s,FILE* stream)
/每次輸出一行到標準輸出/
(24)蝴悉、int puts(const char* s)
/該函數(shù)將一個字符回退到讀流中,所以下次讀的時候從這個字符開始,我們可以想象成是getc的逆操作/
(25)瘾敢、int ugetc(int c,FILE* stream)
/這個函數(shù)將從流中讀取指定個數(shù)的字符放在相應(yīng)的位置,count為數(shù)據(jù)項數(shù)拍冠,每項大小為size尿这,所以總大小為size×count/
(26)、size_t fread(void* data,size_t size,size_t count,FILE* stream)
/這個函數(shù)則可以寫到指定的流中count和size大小的數(shù)據(jù)/
(27)庆杜、size_t fwrite(const void* data,size_t size,size_t count,FILE* stream)
/這個函數(shù)返回文件當(dāng)前的位置射众,是從開始位置起的字節(jié)數(shù),失敗返回-1/
(28)晃财、long int ftell(FILE* stream)
/這個函數(shù)用于改變流的文件位置叨橱,whence+offset/
(29)、int fseek(FILE* stream,long int offset,int whence)
/這個函數(shù)就是定位到文件的開始/
(30)断盛、void rewind(FILE* stream)
/這個函數(shù)將獲取文件的當(dāng)前位置罗洗,保存在pos里面/
(31)、int fgetpos(FILE* stream,fpos_t* pos)
/這個函數(shù)用來設(shè)置流的位置/
(32)钢猛、int fsetpos(FILE* stream,fpos_t* pos)
/這個函數(shù)將返回0伙菜,如果stream的錯誤指示器被設(shè)置/
(33)、int ferror(FILE* stream)
/這個函數(shù)返回0厢洞,當(dāng)且僅當(dāng)文件末尾指示器被設(shè)置/
(34)仇让、int feof(FILE* stream)
/這個函數(shù)用來清除錯誤指示器和文件末尾指示器/
(35)、void clearerr(FILE* stream)
/這個函數(shù)將打開一個文件描數(shù)字(也許創(chuàng)建)/
(36)躺翻、int open(const char* filename,int flag [,mode_t mode])
/這個函數(shù)用來創(chuàng)建一個新的文件,等價于open(filename,O_WRONLY|O_CREAT|O_TRUNC,mode)/
(37)卫玖、int creat(const char* filename,mode_t mode)
/這個函數(shù)將關(guān)閉一個文件描數(shù)字/
(38)公你、int close(int filedes)
/從文件描數(shù)字讀/
(39)、ssize_t read(int filedes,void* buf,size_t nbytes)
/向文件描數(shù)字寫/
(40)假瞬、ssize_t write(int filedes,const void* buf,size_t nbytes)
/這個函數(shù)用來改變文件描數(shù)字的位置/
(41)陕靠、off_t lseek(int filedes,off_t offset,int whence)
/這個函數(shù)將復(fù)制描數(shù)字old到新的描數(shù)字/
(42)、int dup(int old)
/這個函數(shù)將old復(fù)制到new/
(43)脱茉、int dup2(int old,int new)
/這個函數(shù)將使得一個文件描數(shù)字與一個流相連剪芥,函數(shù)返回這個文件描數(shù)字關(guān)聯(lián)的流/
(44)、FILE* fdopen(int filedes,const char* opentype)
/這個函數(shù)將返回與一個文件流相連的文件描數(shù)字/
(45)琴许、int fileno(FILE* stream)
/這個函數(shù)可以實現(xiàn)對文件的各自操作税肪,由參數(shù)cmd決定是什么操作/
(46)、int fcntl(int filedes,int cmd,...)
/這個函數(shù)可以實現(xiàn)散布讀榜田,將文件內(nèi)容讀入到內(nèi)存分散的緩沖區(qū)中益兄,iovec是一個結(jié)構(gòu)體,它擁有數(shù)據(jù)區(qū)的開始地址和大小/
(47)箭券、ssize_t readv(int filedes,const struct iovec* iov,int iovcnt)
/這個函數(shù)實現(xiàn)聚集寫净捅,收集內(nèi)存中分散的緩沖區(qū)中的數(shù)據(jù)寫至文件的連續(xù)區(qū)間,iovec是一個結(jié)構(gòu)體辩块,他擁有數(shù)據(jù)區(qū)的開始地址和大小/
(48)蛔六、ssize_t writev(int filedes,const struct iovec* iov,int iovcnt)
/這個函數(shù)可以用來查看指定文件的特征,返回鏈接所引用的文件的特征/
(49)荆永、int stat(const char* pathname,struct stat* buf)
/這個文件用來查看指定文件的特診,返回鏈接本身的文件特征/
(50)国章、int lstat(const char* pathname,struct stat* buf)
/這個文件返回與文件描數(shù)字相連的文件特征/
(51)具钥、int fstat(int filedes,struct stat* buf)
/這個函數(shù)實現(xiàn)鏈接文件,就是多個文件名表示同一個文件捉腥,注意氓拼,只有一個inode,這是屬于硬鏈接的/
(52)抵碟、int link(const char* existingpath,const char* newpath)
/這個函數(shù)實現(xiàn)符號鏈接桃漾,不直接指向inode,而是指向文件的路徑名拟逮,這個文件可以不存在/
(53)撬统、int symlink(const char* path,const char* sympath)
/這個函數(shù)則打開參數(shù)給定的符號鏈接文件,讀出內(nèi)容放在相應(yīng)的地方敦迄,然后關(guān)閉文件/
(54)恋追、int readlink(const char* pathname,char* buf,int bufsize)
/這個函數(shù)將改變文件的屬主id和組id,改變的是實際文件/
(55)罚屋、int chown(const char* pathname,uid_t owner,gid_t group)
/這個函數(shù)改變文件的屬主id和組id/
(56)苦囱、int fchown(int filedes,uid_t owner,gid_t group)
/這個函數(shù)用來改變文件的屬主id和組id,改變符號鏈接文件/
(57)脾猛、int lchown(const char* pathname,uid_t owner,gid_t group)
/這個函數(shù)將設(shè)置進程的當(dāng)前文件創(chuàng)建屏蔽撕彤,返回老的,不影響父進程/
(58)猛拴、mode_t umask(mode_t cmask)
/這個函數(shù)用來改變文件的訪問方式羹铅,如果是符號鏈接,則改變的是指向的文件而不是本身/
(59)愉昆、int chmod(const char* filename,mode_t mode)
/這個函數(shù)將改變文件的訪問方式职员,如果是符號鏈接,改變的是文件本身/
(60)跛溉、int fchmod(int filedes,mode_t mode)
/這個函數(shù)用來測試一個用戶是否有權(quán)操作一個文件/
(61)焊切、int access(const char* filename,int how)
/這個函數(shù)用來截斷文件,使得一個已經(jīng)存在的文件大小變?yōu)橹付ㄩL度的大小/
(62)倒谷、int ftruncate(int filedes,off_t length)
/這個函數(shù)用來截斷文件蛛蒙,使得一個已經(jīng)存在的文件大小變?yōu)橹付ㄩL度的大小/
(63)、int truncate(const char* pathname,off_t length)
/這個函數(shù)用來改變文件的訪問時間和修改時間/
(64)渤愁、int utime(const char* pathname,const struct utimebuf* times)
/這個函數(shù)頁用來改變文件的訪問時間和修改時間牵祟,數(shù)組第一個用來改變文件的訪問時間,第二個參數(shù)就是修改時間/
(65)抖格、int utimes(const char* path,const struct timeval values[2])
/這個函數(shù)將刪除一個文件名诺苹,并減少此文件的鏈接次數(shù)咕晋,如果計數(shù)為0,那么文件內(nèi)容被刪除/
(66)收奔、int unlink(const char* pathname)
/這個函數(shù)將刪除一個目錄/
(67)掌呜、int rmdir(const char* pathname)
/這個函數(shù)既可以用來刪除文件,也可以用來刪除目錄/
(68)坪哄、int remove(const char* pathname)
/這個函數(shù)用來修改文件名和目錄名/
(69)质蕉、int rename(const char* oldname,const char* newname)
/這個函數(shù)將得到進程的當(dāng)前工作目錄/
(70)、char* getwd(char* pathbuf)
/這個函數(shù)比較厲害翩肌,可以改變進程的工作目錄到指定的目錄模暗,對父進程沒有影響/
(71)、int chdir(const char* pathname)
/這個函數(shù)則實現(xiàn)和chdir一樣念祭,只是參數(shù)不一樣/
(72)兑宇、int fchdir(int filedes)
/這個函數(shù)將創(chuàng)建一個目錄/
(73)、int mkdir(const char* pathname,mode_t mode)
/目錄也是一種文件粱坤,所以可以讀目錄流隶糕,該函數(shù)是第一步,即打開目錄站玄,返回指向其DIR的指針/
(74)枚驻、DIR* opendir(const char* dirname)
/這個函數(shù)讀取目錄DIR中的一個目錄,而且使得指向下一項/
(75)株旷、struct dirent* readdir(DIR* dirp)
/函數(shù)關(guān)閉一個目錄流/
(76)测秸、closedir(DIR* dirp)
/該函數(shù)將恢復(fù)dirp所指向的目錄流指向第一項目錄/
(77)、void rewinddir(DIR* dirp)
/該函數(shù)返回目錄當(dāng)前位置/
(78)灾常、long int telldir(DIR* dirp)
/設(shè)置目錄位置,參數(shù)loc應(yīng)該是telldir返回的結(jié)果/
(79)铃拇、void seekdir(DIR* dirp,long int loc)
/這是環(huán)境表指針钞瀑,其中的內(nèi)容形如name=value/
(80)、extern char** environ;
/這個函數(shù)將返回指定名字的環(huán)境的值/
(81)慷荔、char* getenv(const char* name)
/該函數(shù)可以用來設(shè)置一個環(huán)境變量或者去掉一個環(huán)境變量/
(82)雕什、int putenv(char* str)//the str just like=>name=value
/這個函數(shù)將終止進程/
(83)、void exit(int status)
/這個函數(shù)將流產(chǎn)進程显晶,因為該函數(shù)將生成一個轉(zhuǎn)儲文件/
(84)贷岸、void abort()
/這個函數(shù)將實現(xiàn)動態(tài)分配內(nèi)存/
(85)、void* malloc(sise_t size)
/這個函數(shù)和malloc一樣磷雇,只是常用來為結(jié)構(gòu)體分配內(nèi)存/
(86)偿警、void* calloc(size_t num_of_elem,size_t ele_size)
/這個函數(shù)用來重新分配村內(nèi),需要十分小心的使用/
(87)唯笙、void* realloc(void* ptr,size_t newsize)
/這個函數(shù)釋放動態(tài)分配的內(nèi)存/
(88)螟蒸、void free(void* ptr)
/這個函數(shù)將獲得進程的資源限制,resource 參數(shù)指明那種資源/
(89)盒使、int getrlimit(int resource,struct rlimit* rlptr)
/這個函數(shù)用來設(shè)置進程資源限制,resources指明要設(shè)置哪種資源/
(90)七嫌、int setrlimit(int resource,const struct rlimit* rlptr)
//-|structure define|-
struct rlimit{
rlim_t rlim_cur;//current limit
rlim_t rli_max;//max (machine) lmit
};
/這個函數(shù)用來獲取進程的資源使用情況少办,比如用了多少cpu,缺頁次數(shù)等等/
(91)诵原、int getusage(int who,struct rusage* rusage)
//-|structure define|-
struct rusage{
struct timeval ru_utime;//run user instructions
struct timeval ru_stime;//run os with process
}
//-|structure define|-
struct timeval{
time_t tv_Sec;
suseconds tv_usec;
}
/這個函數(shù)將返回用戶名/
(92)英妓、char* getlogin()
/這個函數(shù)將返回進程的實際用戶id/
(93)、uid_t getuid()
/這個函數(shù)將返回進程的有效用戶id/
(94)绍赛、uid_t geteuid()
/函數(shù)將返回進程的實際組id/
(95)蔓纠、gid_t getgid()
/函數(shù)返回進程的有效組id/
(96)、gid_t getegid()
/獲取進程id和父進程id/
(97)惹资、pid_t getpid()|getppid()
/創(chuàng)建進程/
(98)贺纲、pid_t fork()//返回0表示是子進程,其他表示父進程
/這個函數(shù)將等待進程完成/
(99)褪测、pid_t wait(int stat_loc)|pid_t waitpid(pid_t pid,int stat_loc,int options)
/這個函數(shù)將執(zhí)行一個新程序/
(100)猴誊、int system(const char* command)
/這個函數(shù)將信號數(shù)signo對于的描述信息,如果msg不是空指針的話侮措,那么函數(shù)將用這個msg作為前綴輸出/
(101)懈叹、void psignal(int signo,char* msg)
/這個函數(shù)將簡單的發(fā)送一個信號給調(diào)用他的進程/
(102)、int raise(int signo)
/這個函數(shù)將發(fā)送一個信號給一個進程或者一個進程組分扎,sig指明要發(fā)送的信號/
(103)澄成、int kill(pid_t pid,int sig)
/我們當(dāng)然可以設(shè)置信號的動作,所以下面這個函數(shù)用來設(shè)置信號發(fā)生時的動作,[void(sighandler_t)(int)]/
(104)畏吓、sighandler_t signal(int signum,sighandler_t handler)
/還有一個函數(shù)可以設(shè)置信號動作墨状,這個函數(shù)將更加安全/
(105)、int sigaction(int signum,const struct sigaction act,struct sigaction* oact)
//-|structure define|-
struct sigaction{
void (*sa_handler)();
void (*sa_sigaction)(int,siginfo_t*,void*);
sigset_t sa_mask;
int sa_flags;
};
//--set-- 下面這些函數(shù)完成信號集操作
(106)菲饼、int sigemptyset(sigset_t* set) //將set清空
(107)肾砂、int sigfillset(sigset_t* set)//使得set包含所有信號,和sigemptyset是相反的
(108)宏悦、int sigaddset(sigset_t* set,int signo) //將信號signo加到set集合里面去
(109)镐确、int sigdelset(sigset_t* set,int signo) //將信號signo從set里面移除
(110)、int sigismember(const sigset_tset,int signo) //查看signo信號是不是在信號集合set里面
/該函數(shù)將設(shè)置進程想要阻塞的信號/
(111)饼煞、int sigprocmask(int how,const sigset_t set,sigset_t* oset)
/已經(jīng)發(fā)生但是還未交付的信號稱為懸掛信號源葫,我們可以用這個函數(shù)來檢測是否有懸掛信號,參數(shù)就是返回的懸掛信號集合/
(112)砖瞧、int sigpending(sigset_t* set)
/這個函數(shù)用來等待信號息堂,簡單的懸掛進程知道信號到達/
(113)、int pause()
/這個函數(shù)將更加高級芭届,可以指定那些我們不關(guān)心的信號储矩,所以只有當(dāng)出現(xiàn)不包含在參數(shù)信號集合里面的信號時感耙,才會喚醒進程/
(114)、int sigsuspend(const sigset_t* sigmask)
/這個函數(shù)將返回unix紀元(總秒數(shù)),如果loc是非空指針持隧,那么loc里面也將會有一個副本/
(115)即硼、time_t time(time_t* loc)
/這個函數(shù)將計算兩個時間之間的差,結(jié)果作為雙精度浮點返回/
(116)屡拨、double difftime(time_t time1,time_t time2)
//--set-- 下面的函數(shù)將是以微妙為單位的
(117)只酥、int gettimeofday(struct timeval* restrict tp,void* restrict tzp)//將返回描述和微妙數(shù)在第一個參數(shù)里面,我們不需要知道第二個參數(shù)(時區(qū))
(118)呀狼、int settimeofdat(const struct timeval* tp,const void* tzp) //這個函數(shù)將設(shè)置當(dāng)前時間為tp裂允,當(dāng)然只有特權(quán)用戶才有這樣的資格
(119)、int adjtime(const struct timeval* delta,struct timeval* olddelta) //對時鐘做微調(diào)哥艇,如果為負數(shù)绝编,則系統(tǒng)將走慢一點直到過去那么多時間
//--set-- 下面這組函數(shù)是對上面函數(shù)的操作,也就是將描述或者微妙數(shù)轉(zhuǎn)換為tm結(jié)構(gòu)
(120)貌踏、struct tm* gmtime(const time_t* time) //你需要提供一個time_t類型的指針十饥,函數(shù)將這個指針所指向的時間轉(zhuǎn)換為tm
(121)、struct tm* localtime(const time_t* time) //這個函數(shù)將time轉(zhuǎn)換為本地時間祖乳,很復(fù)雜逗堵,但是使用很簡單
(122)、time_t mktime(struct tm* brokentime) //這個函數(shù)將tm結(jié)構(gòu)的時間轉(zhuǎn)換為time_t類型
//--set-- unix提供了可以將tm或者time_t時間轉(zhuǎn)換為可讀的形式的函數(shù)
(123)眷昆、char* asctime(const struct tm* timeptr) //將timptr轉(zhuǎn)化為可讀的形式返回
(124)蜒秤、char* ctime(const time_t* timeval) //將timeval轉(zhuǎn)換為可讀的形式返回
//--comment-- cpu時間和墻鐘時間,cpu時間也就是進程實際占用cpu運行的時間亚斋,而墻鐘時間則是從進程開始便開始計時的
//--comment-- 所以墻鐘時間可能包含有其他進程運行的時間作媚,當(dāng)然,cpu時間又分為用戶時間和系統(tǒng)時間帅刊,用戶時間就是cpu執(zhí)行
//--comment-- 用戶指令的時間掂骏,而系統(tǒng)時間就是系統(tǒng)為執(zhí)行進程而運行的一些時間,比如系統(tǒng)調(diào)用時間
/這個函數(shù)將返回進程當(dāng)前的cpu時間厚掷,包括用戶時間和系統(tǒng)時間/
(125)、clocl_t clock() //clock_t 表示系統(tǒng)內(nèi)部使用的時間單位级解,為了將返回時間變?yōu)槊朊昂冢枰訡LOCK_PER_SEC
/這個函數(shù)報告更加詳細的cpu時間,包括自己用去的時間勤哗,系統(tǒng)為自己服務(wù)用去的時間抡爹,子進程的時間,同時還返回系統(tǒng)當(dāng)前的墻鐘時間/
(126)芒划、clock_t times(struct tms* buff)
//-|structure define|-
struct tms{
clock_t tms_utime;//user cpu time
clock_t tms_stime;//system cpu time
clock_t tms_cutime;//child user cpu time
clock_t tms_cstime;//child system cpu time
}
/這個函數(shù)將使得進程睡眠一段時間冬竟,它掛起調(diào)用進程直到發(fā)生下面的事情:(1)欧穴、時間到(2)、信號到/
(127)泵殴、unsigned int sleep(unsigned int seconds) //注意涮帘,參數(shù)單位是秒,不是微妙
/這個函數(shù)用來設(shè)置一次性的定時笑诅,只能設(shè)置墻鐘時間调缨,到期會生成SIGALRM信號,如果進程沒有捕捉該信號吆你,默認會結(jié)束該進程/
(128)弦叶、unsigned int alarm(unsigned int seconds)
//--set-- 下面的函數(shù)可以用來設(shè)置或者獲取三種定時器
(129)、int setitimer(int which/whick clock/,const struct itimevalvalue,struct itimerval ovalue)
(130)妇多、int getitimer(int which,struct itimerval* value)
//-|structure define|-
struct itimerval{
struct timeval it_interval;//定時器的間隔時間
struct timeval it_value;//定時器的開始時間
}
//--comment-- 關(guān)于實時時鐘伤哺,系統(tǒng)定義的實時時鐘有幾種類型,可以查看相關(guān)內(nèi)容
//-|structure define|-
struct timespec{
time_t tv_sec;//秒數(shù)
long tv_nsec;//不足一秒的納秒數(shù)
}者祖;
//--set-- 下面的函數(shù)將用來獲取或者設(shè)置實時時鐘
(131)立莉、int clock_getres(clockid_t clock_id,struct timespec* res) //該函數(shù)將返回指定時鐘的分辨率,保存在res里面
(132)咸包、int clock_gettime(clockid_t clock_id,struct timespec* tp) //返回指定實時時鐘的時間桃序,保存在tp里面
(133)、int clock_settime(clockid_t clock_id,const struct timespec* tp) //設(shè)置實時時鐘烂瘫,只有特權(quán)用戶可以
/一種時間更短的睡眠/
(134)媒熊、int nanosleep(const struct timespec* res,struct timespec* rem) //睡眠res時間,如果有信號來了坟比,將剩余時間保存在rem里面
//--comment-- 實時定時器芦鳍,分辨率更高
//-|structure define|-
struct itimerspec
{
struct timespec it_value;//定時開始時間
struct timespec it_interval;//定時間隔
}
//--set-- 下面的函數(shù)將實現(xiàn)創(chuàng)建和刪除實時定時器
(135)、int timer_create(clockid_t clockid,struct sigevent* restrict evp/action/,timer_t restrict timerid/id of timer*/)
(136)葛账、int timer_delete(timer_t timeid) //delete a timer
//--set-- set and get timer
(137)柠衅、int timer_gettimer(timer_t timeid,struct itimerspec* value) //get
(138)、int timer_settimer(timer_t timeid,int flags,const struct itimerspec* restrict value,struct itimerspec* restrict ovalue)
(139)籍琳、int timer_getoverrun(timer_t timeid) //返回定時器的超時次數(shù)
/這個函數(shù)在前面已經(jīng)有介紹菲宴,但是這里作為設(shè)置文件鎖而特別指出/
(140)、int fcntl(int fildes,int cmd,struct flock* lock)
/*
關(guān)于信號驅(qū)動的IO:采用信號驅(qū)動的IO趋急,則當(dāng)在描數(shù)字上有數(shù)據(jù)到達時喝峦,進程會收到一個信號,此時對
該描數(shù)字進行輸入輸出操作將不會被阻塞呜达。
下面是實現(xiàn)信號驅(qū)動的IO的步驟:
(1)谣蠢、調(diào)用sigaction函數(shù)來建立信號句柄
(2)、調(diào)用fcntl函數(shù)用F_SETOWN來設(shè)置接收信號的進程或者進程組
(3)、如果要接收的信號是SIGIO眉踱,需要調(diào)用fcntl函數(shù)用F_SETTFL命令設(shè)置文件描數(shù)字的O_ASYNC標志使其能夠生成SIGIO信號
/
/下面這個函數(shù)功能很強大挤忙,他告訴內(nèi)核,需要等待多種IO事件谈喳,只有當(dāng)這些中的一個或者多個出現(xiàn)時册烈,或者指定的時間過去時,才喚醒調(diào)用他的進程/
(141)叁执、int select(int nfds,fd_set rfds,fd_set* wfds,fd_set* efds,struct timeval* timeout)
關(guān)于上面這個函數(shù)茄厘,函數(shù)將返回已經(jīng)就緒的描數(shù)字的個數(shù),或者超時出返回-1
我們可以用下面的宏定義來查看一些細節(jié):
void FD_ZERO(fd_Set* fdset) //初始化為空
void FD_CLR(int filedes,fd_Set* fdset) //將filedes從fdset里面清除
void FD_ISSET(int filedes,fd_set* fdset) //屬于嗎
void FD_SET(int filedes,fd_set* fdset) //加入
/下面這個函數(shù)和select函數(shù)一樣谈宛,檢查一組文件描數(shù)字次哈,查看是否有任何懸掛的事件,并且可以有選擇的為某個描數(shù)字上的時間設(shè)定時間/
(142)吆录、int poll(struct pollfd fds[],nfds_t nfds,int timeout)
//-|structure define|-
struct pollfd{
int fd;//要檢查的描數(shù)字
short events;//感興趣的事情
short revents窑滞;//fd上發(fā)生的事情
};
/*
* events 是用戶對這個文件描數(shù)字上感興趣的事情,而revents是這個文件描數(shù)字上實際發(fā)生的事件恢筝。
* 也就是函數(shù)的返回值哀卫,最后一個參數(shù)為最長的等待時間,單位時毫秒
*/
/*下面這個函數(shù)可以將一個文件映射到內(nèi)存撬槽,應(yīng)當(dāng)首先用open打開此改,然后調(diào)用下面這個函數(shù)*/
(143)、void* mmap(void* addr,size_t len,int prot,int flags,int filedes,off_t off)
///--- 上面函數(shù)實現(xiàn)將指定文件描數(shù)字filedes中的文件的[off,off+len]區(qū)間映射到進程的內(nèi)存
///--- [paddr,paddr+len]區(qū)間侄柔,paddr是函數(shù)的返回值共啃。也就是最終的映射到進程的開始地址
///--- 那么addr是什么玩意呢?也就是自己指定映射的開始位置暂题,如果為0移剪,那么內(nèi)核將找到合適的
///--- 位置然后告訴進程我把文件映射到了哪里!
///--- 其中薪者,prot是映射區(qū)的保護權(quán)限纵苛,應(yīng)該和open時指定的權(quán)限一致。
///--- flags是映射區(qū)的屬性言津,必須要么是共享的攻人,要么是私有的,還可以加上是否必須返回addr
/當(dāng)然悬槽,有映射自然會有解映射贝椿,下面這個函數(shù)是,mmap的相反函數(shù)/
(144)陷谱、int mumap(void* paddr,size_t len)
///--- paddr應(yīng)該是mmap返回的結(jié)果,len是映射區(qū)的長度。
/對于屬性為共享的存儲映射區(qū)烟逊,當(dāng)映射區(qū)的一頁被修改時渣窜,會被存回硬盤,如果想要在程序的某個點將其中的內(nèi)容寫到磁盤宪躯,下面這個函數(shù)可以/
(145)乔宿、 int msync(void* addr,size_t len,int flags)
///--- flags參數(shù)控制寫回這片區(qū)域的執(zhí)行方式,可以取下面三個
///--- MS_ASYNC -->異步執(zhí)行
///--- MS_SYNC -->同步執(zhí)行访雪,完成函數(shù)才會返回
///--- MS_INVALIDATE -->作廢與指定映射區(qū)中的數(shù)據(jù)不一致的緩存副本
/下面這個函數(shù)用來創(chuàng)建一根管道详瑞,函數(shù)將返回兩個文件描數(shù)字,分別是管道的輸入輸出端/
(146)臣缀、int pipe(int fildes[2])
///--- fildes[0] 將設(shè)置為讀而打開坝橡,dildes[1]將設(shè)置為寫而打開
///--- 管道是沒有名字的,所以叫做匿名管道
/下面這個函數(shù)關(guān)于在調(diào)用進程與要執(zhí)行的命令之間建立一個內(nèi)部的半雙工的管道精置,然后派生一個子進程计寇,執(zhí)行command命令/
///--- 需要注意是,這和system函數(shù)還是有區(qū)別的脂倦,system函數(shù)將等待執(zhí)行完成再返回踱稍,而該函數(shù)將立即返回
(147)硫狞、FILE* popen(const char* command,const char* mode)
/用popen打開的管道需要用下面的函數(shù)來關(guān)閉/
(148)、int pclose(FILE* stream)
///--- 管道只能用于父子進程之間的通信,因為管道建立在內(nèi)核之中胜臊,只有那些有遺傳關(guān)系的進程才能用到它
///--- FIFO特別文件可以在非父子關(guān)系的進程之間實現(xiàn)數(shù)據(jù)交換
///--- 對于FIFO特別文件來說,只要文件被打開衷畦,他的行為就和管道是一樣的振劳。
///--- 在進行通信之前,需要有一個進程以讀打開這個fifo文件布隔,另一個進程以寫打開這個fifo特別文件
/這個函數(shù)將創(chuàng)建一個名字為filename的fifo文件/
(149)离陶、int mkfifo(const char* filename,mode_t mode)
/這個函數(shù)更加強大,不僅可以創(chuàng)建fifo文件衅檀,還可以創(chuàng)建其他的文件招刨,文件類型由mode給出/
(150)、int mknod(const char* filename,mode_t mode,dev_t dev)
/下面這個函數(shù)可以用來創(chuàng)建獲得消息隊列,函數(shù)調(diào)用成功會返回與key相連的id哀军,我們可以用id來訪問消息隊列/
(151)沉眶、int msgget(key_t key,int flags)
/消息隊列的查詢、設(shè)置和刪除/
(152)杉适、 int msgctl(int msqid,int cmd,struct msqid_ds* buf)
///--- cmd 就是我們想要做的事情谎倔,可以取下面的值---
///--- IPC_STAT --> 復(fù)制消息隊列的內(nèi)核數(shù)據(jù)結(jié)構(gòu)到buf里面
///--- IPC_SET -->用buf里面的值設(shè)置消息隊列
///--- IPC_RMID --> 刪除指定的消息隊列
/下面這個函數(shù)實現(xiàn)向一個消息隊列發(fā)送消息/
(153)、 int msgsnd(int msqid,const void* msgp,size_t msgze,int msgflg)
///--- 第一個參數(shù)是消息隊列的id猿推,第二個參數(shù)是指向消息緩沖區(qū)的指針片习,第三個參數(shù)給出消息緩沖區(qū)的消息正文的字節(jié)數(shù)
///--- 不包括消息類型成員(第一個成員)捌肴,最后一個參數(shù)用來引導(dǎo)當(dāng)進程阻塞時的動作
/下面這個函數(shù)用來接收消息/
(154)、ssize_t msgrcv(int msqid,void* msgp,size_t msgsz,long int msgtyp,int msgflg)
///---這個函數(shù)從消息隊列msqid里面讀消息到msgp里面藕咏,msgsz指出消息正文的字節(jié)數(shù)状知,msgtyp指明要接收的消息類型
///--- --> =0 接收消息隊列里面的第一個消息
///--- --> >0 接收類型等于msgtyp的第一個消息,這種方式可實現(xiàn)只接收特定類型的消息
///--- --> <0 接收類型小于或者等于msgtyp絕對值的第一個最低類型的消息孽查,實現(xiàn)優(yōu)先級
/下面這個函數(shù)將實現(xiàn)創(chuàng)建和獲得共享存儲段/
(155)饥悴、int shmget(key_t key,size_t size,int shmflg)
/共享存儲段的查詢、設(shè)置盲再、刪除/
(156)西设、int shmctl(int shmid,int cmd,struct shmid_ds* buf)
/創(chuàng)建好了共享存儲段之后,我們還需要將它映射到進程的地址空間答朋,下面這個函數(shù)可以實現(xiàn)這個功能/
(157)贷揽、void* shmat(int shmid,const void* shmaddr,int shmflg)
///--- 溫馨提示:為了簡單,shmaddr就讓他等于0吧绿映,剩下的事情讓操作系統(tǒng)為你完成
/創(chuàng)建和獲得信號量/
(158)擒滑、int semget(key_t key,int nsems,int semflg)
///--- nsems指明信號量集合中信號量的個數(shù)
/信號量的查詢、設(shè)置叉弦、刪除/
(159)丐一、int semctl(int semid,int semnum,int cmd,[union semun arg])
///--- semid是信號量集合的標志,semnum指明一個特定的信號量
/信號量操作/
(160)淹冰、int semop(int semid,struct sembuf* sops,size_t nsops)
///--- 該函數(shù)對指定的semid信號量集合進行操作库车,操作既可以對其中的一個信號量,也可以針對整個信號量還可以
///--- 是等待信號量樱拴,sops給出操作類型
//-|structure define|-
struct sembuf
{
unsigned short int sem_num;//信號量編號
short int sem_op;//信號量操作
short int sem_flg;//信號量標志
}
///--- sem_op
///--- <0 減少一個信號量柠衍,減少的值為abs(sem_op),當(dāng)為-1時,相當(dāng)于P操作
///--- >0 增加一個信號量晶乔,增加的值為sem_op珍坊,當(dāng)為1時,相當(dāng)于V操作
///--- ==0 等待信號量變?yōu)?
///--- 注意:semop()函數(shù)調(diào)用只有當(dāng)集合中所有信號量都能成功時才成功返回正罢,如果某個信號量不能完成阵漏,失敗翻具!
//套接字等價于網(wǎng)絡(luò)履怯,就好像文件描數(shù)字是磁盤描述的一個端口一樣。我們可以用下面的函數(shù)來創(chuàng)建一個網(wǎng)絡(luò)套接字
(161)裆泳、int socket(int domain,int type,int protocol)
///---socket 將和文件描數(shù)字一樣會返回最小的還沒有被使用的套接字描數(shù)字
///---第一個參數(shù)domain指明通信域:可以為AF_UNIX,AF_INET,AF_INET6
///---第二個參數(shù)是套接字的類型叹洲,可以為:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW.
///---對于第三個參數(shù),只要前兩個參數(shù)確定了工禾,就可以確定第三個參數(shù)也就是協(xié)議了运提,所以只需要填0就可以了
/下面的函數(shù)可以實現(xiàn)同時創(chuàng)建一對套接字描數(shù)字蝗柔,是全雙工的/
(162)、int socketpair(int domain,int type,int protocol,int filedes[])
/下面這個函數(shù)用來關(guān)閉一個已經(jīng)打開的套接字描數(shù)字,黨我們關(guān)閉了一個套接字之和民泵,這個套接字便不再存在/
(163)诫咱、int close(int socket)
/當(dāng)我們這是想斷開連接而不是關(guān)閉一個套接字,那么可以用下面這個函數(shù)來實現(xiàn)/
(164)洪灯、int shutdown(int socket,int how)
///---這個函數(shù)將部分或者全部斷開套接字socket的連接,取決于how的值是什么
///---SHUT_RD:停止從該套接字接收數(shù)據(jù)
///---SHUT_WR:停止從該套接字傳送數(shù)據(jù)
///---SHUT_RDWR:停止從該套接字傳輸和接收數(shù)據(jù)
/下面這組函數(shù)將實現(xiàn)ip地址的格式轉(zhuǎn)換竟痰,可以從二進制形式轉(zhuǎn)換為點分十進制形式签钩,也可以向相反的方向轉(zhuǎn)換/
(165)、int inet_aton(const char* name,struct in_addr* addr) //從字符串轉(zhuǎn)換到二進制(32位)坏快,保存在addr里面
(166)铅檩、char* inet_ntoa(struct in_addr* addr)//將32位的ip地址轉(zhuǎn)換為字符串形式
(167)、int inet_pton(int family,const charnameptr,void addrptr) //將可以用在ipv4上莽鸿,也可以用在ipv4上
(168)昧旨、const char* inet_ntop(int family,void* addptr,char* nameptr,size_t len)
//在unix里面,用了一個主機網(wǎng)絡(luò)地址數(shù)據(jù)庫來記住主機名和主機ip地址之間的映射
//我們可以用下面的函數(shù)來從這個數(shù)據(jù)庫中獲得一臺主機的完整地址信息
(168)祥得、struct hostent* gethostbyname(const char* name)
(169)兔沃、struct hostent* gethostbyaddr(const void* addr,size_t length,int type) //length is the len of addr,the type is the type of addr
/我們可以用下面的這個函數(shù)來打開地址數(shù)據(jù)庫,當(dāng)參數(shù)為不為0時级及,將會和數(shù)據(jù)庫建立持久連接/
(170)乒疏、void sethostent(int stayopen)
(171)、struct hostent* gethostent();
(172)饮焦、void endhostent(); //關(guān)閉數(shù)據(jù)庫
///--我們知道有一些默認的應(yīng)用是綁定到了固定的端口上的怕吴,比如21號端口就是用來進行FTP服務(wù)的,我們
///---可以通過下面的函數(shù)來查看一些著名的服務(wù)
(173)县踢、struct servent* getservbyname(const char* name,const char* proto)
(174)转绷、struct servent* getservbyport(int port,const char* proto)
(175)、void setservent(int stayopen)
(176)硼啤、struct servent* getservent();
(177)议经、void endservent()
///---下面是很煩很無聊的字節(jié)順序轉(zhuǎn)換,在網(wǎng)絡(luò)上操作的話都要轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序
(178)丙曙、uint_16_t htos(uint_16_t hostshort)
(179)爸业、uint_32_t htol(uint_32_t hostlong)
(180)、uint_16_t stoh(uint_16_t hostshort)
(181)亏镰、uint_32_t ltoh(uint_32_t hostlong)
///---好吧扯旷,現(xiàn)在我們應(yīng)該會創(chuàng)建一個套接字描數(shù)字,然后也了解了ip地址索抓,套接字等內(nèi)容钧忽,下面我們需要給套機字一個名字
///---當(dāng)套接字有了名字之和毯炮,我們就可以使用套機字名字來操作這個套機字了,也就是說耸黑,套機字沒有名字桃煎,其他進程根本
///---無法訪問到這個沒有名字的套接字,所以我們需要給他一個名字大刊,下面這個函數(shù)可以實現(xiàn)將一個套接字綁定在一個名字上
(182)为迈、int bind(int socket,const struct sockaddr* address,socklen_t address_len)
///---現(xiàn)在我們先來了解一下套機字是怎么工作的:首先用socket函數(shù)創(chuàng)建一個套接字描數(shù)字,然后調(diào)用bind函數(shù)來給
///---這個套接字綁定一個名字缺菌,以便其他進程可以訪問這個套接字葫辐。然后用listen來監(jiān)聽這個套接字上的活動,在多個
///---客戶與該套接字建立連接的情況下伴郁,listen函數(shù)為進入該套接字的連接創(chuàng)建一個連接隊列耿战,然后調(diào)用accept函數(shù)
///---逐一處理這些連接,需要知道的是焊傅,每次調(diào)用accept函數(shù)剂陡,系統(tǒng)都將創(chuàng)建一個新的套接字,但是這個新的套接字將
///---只用于與特定的客戶連接狐胎,所以不需要命名鸭栖,那已經(jīng)命名的套接字保留用于與其他用戶連接,這樣就可以實現(xiàn)
///---一個套接字描數(shù)字和多個客戶通信的需求了---->以上言論對有連接的套接字通信有效
///---對于無連接的套接字通信顽爹,事情變得很簡單纤泵,他使用對等的方式來進行數(shù)據(jù)交換,但是依然需要bind一個名字
///---然后事情就在recvfrom和sendto這兩個函數(shù)之間變得有趣了镜粤!
//下面這個函數(shù)是對于流套接字操作而言的捏题,而且這個函數(shù)用于客戶端請求與服務(wù)端建立一個連接
(183)、int connect(int socket,const struct sockaddr* address,socklen_t address_len)
//下面函數(shù)可以在套接字上創(chuàng)建偵探隊列,成功后這個套接字將稱為被動套接字肉渴,也就是服務(wù)套機字
(184)公荧、int listen(int socket,int backlog) //backlog指明該套接字上可以懸掛的請求連接數(shù)
//下面函數(shù)將會創(chuàng)建一個新的套機字來為客戶服務(wù),函數(shù)將返回新套接字的描數(shù)字,后兩個參數(shù)將作為返回
(185)同规、int accept(int socket,struct sockaddr* address,socklen_t* address_len)
//兩個套接字建立連接之和循狰,我們可以通過下面的函數(shù)來查看對方套機字地址和本地套機字地址
(186)、int getsockname(int socket,struct socketaddr* address,socklen_t* address_len) //獲取本地
(187)券勺、int getpeername(int sock,struct sockaddr* address,socklen_t* address_len) //獲取對方的
/我們應(yīng)該知道绪钥,套接字也是一種文件,所以可以像操作文件一樣操作套接字关炼,write和read可以用來從一個套接字讀取數(shù)據(jù)和發(fā)送數(shù)據(jù)/
///---下面的函數(shù)也可以實現(xiàn)向一個套接字發(fā)送數(shù)據(jù)或者從套接字讀取數(shù)據(jù)
(188)程腹、ssize_t send(int socket,const void* buffer,size_t length,int flags)
///---需要注意的是最后一個參數(shù),如果最后一個參數(shù)為0儒拂,那么就和write一樣了寸潦,當(dāng)然這個標志可以取下面的值
///---MSG_OOB:使得send發(fā)送的數(shù)據(jù)稱為帶外數(shù)據(jù)
///---MSG_DONTROUTE:不再消息中包含路由信息
(189)色鸳、ssize_t recv(int socket,void* buffer,size_t length,int flags)
///---最后一個參數(shù)要是取0的話,和read是一樣的
///---MSG_PEEK:窺視套接字上的數(shù)據(jù)但是不讀取他們
///---MSG_OOB:讀帶外數(shù)據(jù)
///---MSG_WAITALL:函數(shù)將阻塞直到讀到所請求的全部數(shù)據(jù)
/下面的函數(shù)將可以查看和設(shè)置套接字的各自選項/
(190)见转、int getsockopt(int socket,int level,int optname,void* optval,socklen_t* optlen)
(191)命雀、int setsockopt(int socket,int level,int optname,const void* optval,socklen_t optlen)
///---需要注意的是,參數(shù)socket需要是已經(jīng)打開的套接字斩箫,level指出所選擇的層次吏砂,可以是下面的值
///---SOL_SOCKET,IPPOTO_IP,IPPOTO_TCP
///---optname指出選項的名字,對于getsockopt來說乘客,函數(shù)將讀取名字為optname的選擇赊抖,將讀出來的值
///---保存在optval里面,對于設(shè)置來說寨典,需要自己指定optval
///---選項可以查看相應(yīng)的文檔獲得
/下面這個函數(shù)可以判斷當(dāng)前是否處在帶外數(shù)據(jù)標志的位置/
(192)、int sockatmark(int sockfd)
///---(1)房匆、當(dāng)下一個要讀的字節(jié)是oob時耸成,函數(shù)返回真
///---(2)、讀操作總是停止在帶外數(shù)據(jù)標志之處
/下面這兩個函數(shù)可以實現(xiàn)對數(shù)據(jù)報套接字的數(shù)據(jù)發(fā)送與接收/
(193)浴鸿、int recvfrom(int socket,void* buffer,size_t size,int flags,struct sockaddr* from,size_t* addrlen)
(194)井氢、int sendto(int socket,void* buffer,size_t size,int flags,struct sockaddr* to,size_t addrlen)
///---需要特別說明,數(shù)據(jù)報套接字也可以使用connect函數(shù)岳链,但是對于數(shù)據(jù)報套接字來說這個函數(shù)并不會建立連接
///---而只是給將來在此套接字上的傳送指定地址花竞,內(nèi)核將記錄對等套接字的ip地址和端口,這樣我們就可以不用
///---recvfrom和sendto函數(shù)了掸哑,可以使用read或者recv或者write或者send函數(shù)了
/下面的函數(shù)可以查看一個線程自己的線程id约急,需要知道的是線程也有線程id,而且在一個進程里面的每一個線程都具有不一樣的線程id/
(195)苗分、pthread_t pthread_self()
/下面這個函數(shù)可以用來比較倆個線程id厌蔽,兩個線程id相同時返回非0,不同時返回0/
(196)摔癣、int pthread_equal(pthread_t t1,pthread_t t2)
/下面這個函數(shù)用來創(chuàng)建一個新的線程/
(197)奴饮、int pthread_create(pthread_t restrict thread,const pthread_attr_t restrict attr,
void(start_routine)(void),void restrict argv)
///---每一個進程一開始就會有一個線程,稱為初始線程择浊,或者叫做主線程戴卜,他是從main函數(shù)開始的,進程中的其他
///---線程在創(chuàng)建線程時指定一個線程開始函數(shù)琢岩,這個線程開始函數(shù)只能有一個void*的參數(shù)投剥,這個新創(chuàng)建的線程將
///---從這個函數(shù)開始執(zhí)行
///--第一個參數(shù)是函數(shù)的返回值,函數(shù)調(diào)用成功將返回這個新創(chuàng)建的線程的id粘捎,第二個參數(shù)指定新創(chuàng)建的線程的屬性
/下面這個函數(shù)將終止線程薇缅,也就是終止自己的執(zhí)行/
(198)危彩、int pthread_exit(void* value_ptr)
///---參數(shù)應(yīng)該是一個出口狀態(tài),當(dāng)其他的線程在等待這個線程時泳桦,當(dāng)這個線程結(jié)束時汤徽,其他等待該線程的線程將會得到這個
///---線程出口狀態(tài),然后做下一步的動作
/下面這個函數(shù)用來等待一個線程終止/
(199)灸撰、int pthread_join(pthread_t thread,void** value_ptr)
///---該函數(shù)將懸掛調(diào)用該函數(shù)的線程直到所等待的線程終止谒府,第二個參數(shù)將保存從等待線程返回的出口狀態(tài),該
///---線程可以根據(jù)這個出口狀態(tài)來執(zhí)行相應(yīng)的函數(shù)
///---關(guān)于可匯合線程和分離線程
///---可匯合線程:線程的資源需要另一個線程調(diào)用pthread_join與他匯合之后才能被釋放
///---分離線程:線程一旦終止浮毯,系統(tǒng)將立刻回收他的資源
/下面的函數(shù)可以將原本可匯合的線程變?yōu)榉蛛x的線程完疫,需要知道的是,默認創(chuàng)建的線程都是可匯合的/
(200)债蓝、int pthread_detach(pthread_t thread)
///---已經(jīng)分離的線程不能和其他線程匯合壳鹤,所以一旦一個線程被設(shè)置為分離的,那么這個線程就不能被pthread_join
/下面的一組函數(shù)用來設(shè)置特殊屬性的線程/
///---線程的一般屬性包括:分離狀態(tài)屬性饰迹,棧的大小芳誓,棧地址,棧溢出保護區(qū)大小啊鸭,調(diào)度屬性锹淌,調(diào)度的競爭范圍,調(diào)度的繼承屬性
///---調(diào)度策略赠制,調(diào)度參數(shù)
(201)赂摆、int pthread_attr_init(pthread_attr_t attr) //初始化一個線程屬性
(202)、int pthread_attr_destroy(pthread_attr_t attr) //銷毀一個線程屬性對象
(203)钟些、int pthread_attr_getdetachstate(pthread_attr_t* attr,int* detachstate) //查詢線程屬性對象的分離狀態(tài)烟号,將返回在第二個參數(shù)里面
(204)、int pthread_attr_setdetachstate(const pthread_ttr_t* attr,int detachstate) //設(shè)置線程屬性屬性對象的分離狀態(tài)
///---下面是互斥變量的初始化和銷毀
(205)政恍、pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
(206)褥符、int pthread_mutex_init(pthread_mutex_t restrict mutex,const pthread_mutexattr_t restrict attr) //初始化
(207)、int pthread_mutex_destroy(pthread_mutex_t *mutex)
///---互斥變量也是有屬性的抚垃,現(xiàn)在有兩種屬性喷楣,一種是進程共享屬性,和類型屬性
///---共享屬性設(shè)置一個互斥鎖是否可以在進程之間使用
///---下面的函數(shù)是和互斥變量屬性相關(guān)的函數(shù)
(208)鹤树、int pthread_mutexattr_init(pthread_mutexattr_t * attr) //初始化一個互斥變量屬性
(209)铣焊、int pthread_mutexattr_destroy(pthread_mutexattr_t* attr) //銷毀一個互斥變量屬性
///---下面兩組函數(shù)可以用來設(shè)置互斥變量的進程共享屬性和類型屬性
(210)、int pthread_mutexattr_setpshared(pthread_mutexattr_t* attr,int pshared) //設(shè)置進程共享屬性
(211)罕伯、int pthread_mutexattr_getpshared(pthread_mutexattr_t* attr,int *restrict pshared) //查看互斥變量的進程共享屬性
(212)曲伊、int pthread_mutexattr_settype(pthread_mutexattr_t* attr,int pshared) //設(shè)置互斥變量類型屬性
(213)、int pthread_mutexattr_hettype(pthread_mutexattr_t* attr,int * restrict type)
///--下面的函數(shù)用來對互斥變量加鎖或者解鎖
(214)、int pthread_mutex_lock(pthread_mutex_t* mutex) //上鎖坟募,但是如果失敗岛蚤,等待直到獲得鎖才返回
(215)、int pthread_mutex_trylock(pthread_mutex_t* mutex)//如果上鎖失敗的話懈糯,立刻返回錯誤<EBUSY>
(216)涤妒、int pthread_mutex_unlock(pthread_mutex_t* mutex)//解鎖
///---下面的函數(shù)是和spin鎖相關(guān)的函數(shù),操作和理解方式和互斥鎖一樣
(217)赚哗、int pthread_spin_init(pthread_spinlock_t * lock,int pshared) //初始化一個spin
(218)她紫、int pthread_spin_destroy(pthread_spinlock_t* lock)
(219)、int pthread_spin_lock(pthread_spinlock_t* lock)
(220)屿储、int pthread_spin_trylock(pthread_spinlock_t* lock)
(221)贿讹、int pthread_spin_unlock(pthread_spinlock_t* lock)
///---需要注意的是,spin鎖和互斥鎖還是不一樣的够掠,當(dāng)上鎖受阻時民褂,線程不需要阻塞而是可以輪詢直到獲得鎖
///---下面的函數(shù)是關(guān)于讀寫鎖的
///---讀寫鎖支持線程對數(shù)據(jù)的共享讀互斥寫
///---可以以讀方式上鎖,一個線程占有這個鎖之后疯潭,還是允許其他的線程來以讀的方式上鎖
///---可以以寫方式上鎖助赞,一個線程占有這個鎖之后,不允許其他的鎖進來
(222)袁勺、pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALZER;
(223)、int pthread_rwlock_init(pthread_rwlock_t* restrict rwlock,const pthread_rwlockattr_t* attr)
(224)畜普、int pthread_rwlock_destroy(pthread_rwlock_t* rwlock)
///---需要注意的是期丰,讀寫鎖只有一種屬性,可以指定為進程之內(nèi)或者是進程之間
///---下面的函數(shù)是關(guān)于讀寫鎖屬性的函數(shù)
(225)吃挑、int pthread_rwlockattr_init(pthread_rwlockattr_t* attr)
(226)钝荡、int pthread_rwlockattr_destroy(pthread_rwlockattr_t* attr)
(227)、int pthread_rwlockattr_setpshared(pthread_rwlockattr_t* attr,int pshared)
(228)舶衬、int pthread_rwlockattr_getpshared(pthread_rwlockattr_t* attr,int pshared)
///---下面的函數(shù)是關(guān)于讀寫鎖的上鎖和解鎖的
(229)埠通、int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock) //以讀方式上鎖,如果不能獲得鎖逛犹,那么受阻直到獲得鎖
(230)端辱、int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock) //如果線程不能立刻獲得鎖的話,那么這個函數(shù)將會返回EBUSY<立刻>
(231)虽画、int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
(232)舞蔽、int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock)
///---無論讀寫鎖是怎么加的鎖,下面這個函數(shù)都可以解開
(234)码撰、int pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
///---關(guān)于條件變量
///---下面的函數(shù)是關(guān)于初始化和銷毀條件變量的
(235)渗柿、pthread_cond_t cond=PTHREAD_COND_INITIALZER;
(236)、int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t* attr)
(237)脖岛、int pthread_cond_destroy(pthread_cond_t* cond)
///---條件變量的屬性操作函數(shù)集合
(238)朵栖、int pthread_condattr_init(pthread_condattr_t* attr)
(239)颊亮、int pthread_condattr_destroy(pthread_condattr_t* attr)
(240)、int pthread_condattr_setpshared(pthread_condattr_t* attr,int * pshared)
(241)陨溅、int pthread_condattr_getpshared(pthread_condattr_t* attr, int * pshared)
///---等待條件變量
///---一個是執(zhí)行正常的等待操作终惑,一個是指定定時的等待操作
(242)、int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex)//mutex是與條件變量相關(guān)連的互斥變量
(243)声登、int pthread_cond_timedwait(pthread_cond_t* cond,pthread_mutex_t* mutex,struct timespec* abstime)
///---需要注意的是狠鸳,調(diào)用這兩個函數(shù)之前mutex必須處于鎖住的狀態(tài),在這兩個函數(shù)阻塞之前悯嗓,函數(shù)將會釋放mutex
///---喚醒條件變量的等待件舵,可以有兩種方式來喚醒,一種是每次喚醒一個線程脯厨,稱為“發(fā)信號”
///---另一種則一次喚醒等待在同一個條件變量上的所有線程铅祸,這種方式稱為“廣播”
(244)、int pthread_cond_signal(pthread_cond_t* cond)
(245)合武、int pthread_cond_broadcast(pthread_cond_t* cond)
///---如果沒有線程等待在條件變量cond上面临梗,那么這個兩個函數(shù)將沒有任何作用
///---關(guān)于線程專有數(shù)據(jù)鍵
(246)、int pthread_key_create(pthread_key_t * key,void(destrcutor)(void)) //函數(shù)返回在key里面
///---創(chuàng)建鍵的作用只是為每一個線程相連一個指向其專有存儲空間的指針稼跳,這些指針的初始值都是null盟庞,key一旦
///---創(chuàng)建成功,那么就可以通過函數(shù)pthread_getspecific()使之指向各自分配的專有數(shù)據(jù)存儲空間
///---第二個參數(shù)是一個析構(gòu)函數(shù)汤善,這個函數(shù)負責(zé)在線程終止時做一些回收工作什猖,所以當(dāng)線程終止時,線程會查看
///---線程專有數(shù)據(jù)鍵红淡,如果上面有安裝析構(gòu)函數(shù)的話不狮,那么就執(zhí)行這個析構(gòu)函數(shù)
///---需要注意的是,線程專有數(shù)據(jù)鍵只能由一個線程創(chuàng)建一次在旱,如果多次創(chuàng)建摇零,會丟失數(shù)據(jù)
///---下面這個函數(shù)可以保證一個專有數(shù)據(jù)鍵只創(chuàng)建一次
(247)、pthread_once_t once_control=PTHREAD_ONCE_INIT;
(248)桶蝎、int pthread_once(pthread_once_t* once_control,void(*init_routine)(void))
///---第二個參數(shù)是一個初始化參數(shù)驻仅,pthread_once函數(shù)會記錄這個初始化函數(shù)是否已經(jīng)被調(diào)用,如果已經(jīng)被調(diào)用
///---那么任何調(diào)用pthread_once函數(shù)創(chuàng)建的數(shù)據(jù)key都將以失敗返回
///---下面的函數(shù)可以用來刪除一個專有數(shù)據(jù)鍵
(249)登渣、int pthread_key_delete(pthread_key_t key)
///---對于每一個線程雾家,當(dāng)線程專有數(shù)據(jù)鍵創(chuàng)建時,都是null的绍豁,為了使用線程專有數(shù)據(jù)鍵芯咧,每一個線程需要給專有數(shù)據(jù)鍵指定值
///---線程專有數(shù)據(jù)鍵是全局的,線程內(nèi)的所有函數(shù)都能訪問,但是每一個線程與鍵相連的存儲空間是獨立的敬飒,因此邪铲,他們是私有的
///---也就是,他們是對線程私有的全局數(shù)據(jù)
///---下面的函數(shù)用來設(shè)置線程的專有數(shù)據(jù)和訪問線程專有數(shù)據(jù)
(250)无拗、int pthread_setspecific(pthread_key_t key,const void* value) //設(shè)置value為調(diào)用線程的線程專有數(shù)據(jù)鍵key
(251)带到、void *pthread_getspecific(pthread_key_t key)//獲得鍵key對應(yīng)于調(diào)用線程的專有數(shù)據(jù)
///---線程與信號
///---在多線程的情況下,信號屏蔽不再是整個進程只有一個英染,而是每個線程一個
///---雖然所以線程共享相同的信號動作揽惹,但是每個線程可以阻塞自己不想處理的信號
///---下面的函數(shù)用來設(shè)置信號屏蔽
(252)、int pthread_sigmask(int how,const sigset_t* set,sigset_t* oldset)
///---how->
///---SIG_BLOCK:將set添加進來
///---SIG_UNBLOCK:將set移除
///---SIG_SETMASK:替換原來的
///---下面的函數(shù)用來向線程發(fā)送信號
///---線程向進程發(fā)送信號任然使用kill
(253)四康、int pthread_kill(pthread_t thread,int aigno)
///---線程可以用下面的方式向自己發(fā)送信號
pthread_kill(pthread_self(),sig) or raise(sig)
///---等待信號搪搏,在接收到信號之后直接對信號進行處理,而不需要信號句柄
///---該函數(shù)將阻塞調(diào)用線程直到出現(xiàn)set里面的信號,sig會返回信號數(shù)量
(254)闪金、int sigwait(const sigset_t* set,int * sig)
///---要注意的是疯溺,在線程調(diào)用sigwait之前,所有線程都應(yīng)當(dāng)阻塞了信號集set中的信號哎垦,否則會導(dǎo)致不可預(yù)測的結(jié)果
/--2016/4/16--hujian--/