作者: 一字馬胡
轉(zhuǎn)載標(biāo)志 【2018-03-27】
更新日志
日期 | 更新內(nèi)容 | 備注 |
---|---|---|
2018-03-27 | 回顧以前的知識(shí) | link from csdn |
/這個(gè)函數(shù)可以將errno直接轉(zhuǎn)換為可讀的錯(cuò)誤形式/
(1)、char* strerror(int errnum)
/這個(gè)函數(shù)將直接打印出errno當(dāng)前值所對(duì)應(yīng)的錯(cuò)誤信息打印出來(lái),參數(shù)可以指定一個(gè)字符串,函數(shù)將這個(gè)字符串顯示在錯(cuò)誤信息前面/
(2)、void perror(const char* msg)
/這個(gè)函數(shù)可以用來(lái)獲取主機(jī)名/
(3)、int gethostname(char* name,size_t size)
/這個(gè)函數(shù)可以設(shè)置主機(jī)名/
(4)、int sethostname(const char* name,size_t length)
/這個(gè)函數(shù)將返回操作系統(tǒng)和主機(jī)的信息,保存在參數(shù)info里面,那是一個(gè)結(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
};
/這個(gè)函數(shù)用于獲取系統(tǒng)當(dāng)前系統(tǒng)變量之值,參數(shù)為需要查看的系統(tǒng)變量/
(6)、long int sysconf(int parameter)
/這個(gè)函數(shù)用來(lái)獲取文件系統(tǒng)限制和選項(xiàng)/
(7)、long int pathconf(const char* pathname,int parameter)
/這個(gè)函數(shù)一樣用來(lái)獲取文件系統(tǒng)的限制和選項(xiàng),只是需要提供的是文件描數(shù)字/
(8)、long int fpathconf(int filedes,int parameter)
/這個(gè)函數(shù)可以獲得當(dāng)前工作目錄/
(9)、int getcwd(char* buffer,size_t size)
/這個(gè)函數(shù)用來(lái)打開(kāi)一個(gè)文件流/
(10)、FILE* fopen(const char* pathname,const char* opentype)
/這個(gè)函數(shù)用來(lái)關(guān)閉一個(gè)文件流/
(11)、int fclose(FILE* stream)
/這個(gè)函數(shù)用來(lái)重新打開(kāi)文件流/
(12)、FILE* freopen(const char* pathname,const charopentype,FILE stream)
/這個(gè)函數(shù)用來(lái)讀取一個(gè)字符,并且強(qiáng)制轉(zhuǎn)換為int/
(13)、int fgetc(FILE* stream)
/這個(gè)函數(shù)和fgetc一樣,只是可以作為宏使用,而fgetc不可以/
(14)、int getc(FILE* stream)
/這個(gè)函數(shù)相當(dāng)于getc(stdin),也就是從標(biāo)準(zhǔn)輸入讀入/
(15)、int getchar(void)
/這個(gè)函數(shù)將int c強(qiáng)制轉(zhuǎn)換為unsigned char c,然后寫(xiě)入stream/
(16)、int fputc(int c,FILE* stream)
/可以用宏來(lái)實(shí)現(xiàn),其他和fputc一樣/
(17)、int putc(int c,FILE* stream)
/標(biāo)準(zhǔn)輸出,相當(dāng)于putc(stdout)/
(18)、int putchar(int c)
/這個(gè)函數(shù)將連續(xù)讀取count-1個(gè)字符,然后在末尾添加‘\0’,注意如果需要讀的字符多了,那么就要多次調(diào)用/
(19)、char* fgets(chars,int count,FILE stream)
/這個(gè)函數(shù)只從標(biāo)準(zhǔn)輸入讀取,功能和fgets一樣,只是一次讀完/
(20)、char* gets(char* s)
/這個(gè)函數(shù)用來(lái)從流中讀入一行/
(21)、ssize_t getline(char** lineptr,size_t n,FILE* stream)
/這個(gè)函數(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)
/每次輸出一行到標(biāo)準(zhǔn)輸出/
(24)、int puts(const char* s)
/該函數(shù)將一個(gè)字符回退到讀流中,所以下次讀的時(shí)候從這個(gè)字符開(kāi)始,我們可以想象成是getc的逆操作/
(25)、int ugetc(int c,FILE* stream)
/這個(gè)函數(shù)將從流中讀取指定個(gè)數(shù)的字符放在相應(yīng)的位置,count為數(shù)據(jù)項(xiàng)數(shù),每項(xiàng)大小為size,所以總大小為size×count/
(26)、size_t fread(void* data,size_t size,size_t count,FILE* stream)
/這個(gè)函數(shù)則可以寫(xiě)到指定的流中count和size大小的數(shù)據(jù)/
(27)、size_t fwrite(const void* data,size_t size,size_t count,FILE* stream)
/這個(gè)函數(shù)返回文件當(dāng)前的位置,是從開(kāi)始位置起的字節(jié)數(shù),失敗返回-1/
(28)、long int ftell(FILE* stream)
/這個(gè)函數(shù)用于改變流的文件位置,whence+offset/
(29)、int fseek(FILE* stream,long int offset,int whence)
/這個(gè)函數(shù)就是定位到文件的開(kāi)始/
(30)、void rewind(FILE* stream)
/這個(gè)函數(shù)將獲取文件的當(dāng)前位置,保存在pos里面/
(31)、int fgetpos(FILE* stream,fpos_t* pos)
/這個(gè)函數(shù)用來(lái)設(shè)置流的位置/
(32)、int fsetpos(FILE* stream,fpos_t* pos)
/這個(gè)函數(shù)將返回0,如果stream的錯(cuò)誤指示器被設(shè)置/
(33)、int ferror(FILE* stream)
/這個(gè)函數(shù)返回0,當(dāng)且僅當(dāng)文件末尾指示器被設(shè)置/
(34)、int feof(FILE* stream)
/這個(gè)函數(shù)用來(lái)清除錯(cuò)誤指示器和文件末尾指示器/
(35)、void clearerr(FILE* stream)
/這個(gè)函數(shù)將打開(kāi)一個(gè)文件描數(shù)字(也許創(chuàng)建)/
(36)、int open(const char* filename,int flag [,mode_t mode])
/這個(gè)函數(shù)用來(lái)創(chuàng)建一個(gè)新的文件,等價(jià)于open(filename,O_WRONLY|O_CREAT|O_TRUNC,mode)/
(37)、int creat(const char* filename,mode_t mode)
/這個(gè)函數(shù)將關(guān)閉一個(gè)文件描數(shù)字/
(38)、int close(int filedes)
/從文件描數(shù)字讀/
(39)、ssize_t read(int filedes,void* buf,size_t nbytes)
/向文件描數(shù)字寫(xiě)/
(40)、ssize_t write(int filedes,const void* buf,size_t nbytes)
/這個(gè)函數(shù)用來(lái)改變文件描數(shù)字的位置/
(41)、off_t lseek(int filedes,off_t offset,int whence)
/這個(gè)函數(shù)將復(fù)制描數(shù)字old到新的描數(shù)字/
(42)、int dup(int old)
/這個(gè)函數(shù)將old復(fù)制到new/
(43)、int dup2(int old,int new)
/這個(gè)函數(shù)將使得一個(gè)文件描數(shù)字與一個(gè)流相連,函數(shù)返回這個(gè)文件描數(shù)字關(guān)聯(lián)的流/
(44)、FILE* fdopen(int filedes,const char* opentype)
/這個(gè)函數(shù)將返回與一個(gè)文件流相連的文件描數(shù)字/
(45)、int fileno(FILE* stream)
/這個(gè)函數(shù)可以實(shí)現(xiàn)對(duì)文件的各自操作,由參數(shù)cmd決定是什么操作/
(46)、int fcntl(int filedes,int cmd,...)
/這個(gè)函數(shù)可以實(shí)現(xiàn)散布讀,將文件內(nèi)容讀入到內(nèi)存分散的緩沖區(qū)中,iovec是一個(gè)結(jié)構(gòu)體,它擁有數(shù)據(jù)區(qū)的開(kāi)始地址和大小/
(47)、ssize_t readv(int filedes,const struct iovec* iov,int iovcnt)
/這個(gè)函數(shù)實(shí)現(xiàn)聚集寫(xiě),收集內(nèi)存中分散的緩沖區(qū)中的數(shù)據(jù)寫(xiě)至文件的連續(xù)區(qū)間,iovec是一個(gè)結(jié)構(gòu)體,他擁有數(shù)據(jù)區(qū)的開(kāi)始地址和大小/
(48)、ssize_t writev(int filedes,const struct iovec* iov,int iovcnt)
/這個(gè)函數(shù)可以用來(lái)查看指定文件的特征,返回鏈接所引用的文件的特征/
(49)、int stat(const char* pathname,struct stat* buf)
/這個(gè)文件用來(lái)查看指定文件的特診,返回鏈接本身的文件特征/
(50)、int lstat(const char* pathname,struct stat* buf)
/這個(gè)文件返回與文件描數(shù)字相連的文件特征/
(51)、int fstat(int filedes,struct stat* buf)
/這個(gè)函數(shù)實(shí)現(xiàn)鏈接文件,就是多個(gè)文件名表示同一個(gè)文件,注意,只有一個(gè)inode,這是屬于硬鏈接的/
(52)、int link(const char* existingpath,const char* newpath)
/這個(gè)函數(shù)實(shí)現(xiàn)符號(hào)鏈接,不直接指向inode,而是指向文件的路徑名,這個(gè)文件可以不存在/
(53)、int symlink(const char* path,const char* sympath)
/這個(gè)函數(shù)則打開(kāi)參數(shù)給定的符號(hào)鏈接文件,讀出內(nèi)容放在相應(yīng)的地方,然后關(guān)閉文件/
(54)、int readlink(const char* pathname,char* buf,int bufsize)
/這個(gè)函數(shù)將改變文件的屬主id和組id,改變的是實(shí)際文件/
(55)、int chown(const char* pathname,uid_t owner,gid_t group)
/這個(gè)函數(shù)改變文件的屬主id和組id/
(56)、int fchown(int filedes,uid_t owner,gid_t group)
/這個(gè)函數(shù)用來(lái)改變文件的屬主id和組id,改變符號(hào)鏈接文件/
(57)、int lchown(const char* pathname,uid_t owner,gid_t group)
/這個(gè)函數(shù)將設(shè)置進(jìn)程的當(dāng)前文件創(chuàng)建屏蔽,返回老的,不影響父進(jìn)程/
(58)、mode_t umask(mode_t cmask)
/這個(gè)函數(shù)用來(lái)改變文件的訪問(wèn)方式,如果是符號(hào)鏈接,則改變的是指向的文件而不是本身/
(59)、int chmod(const char* filename,mode_t mode)
/這個(gè)函數(shù)將改變文件的訪問(wèn)方式,如果是符號(hào)鏈接,改變的是文件本身/
(60)、int fchmod(int filedes,mode_t mode)
/這個(gè)函數(shù)用來(lái)測(cè)試一個(gè)用戶是否有權(quán)操作一個(gè)文件/
(61)、int access(const char* filename,int how)
/這個(gè)函數(shù)用來(lái)截?cái)辔募沟靡粋€(gè)已經(jīng)存在的文件大小變?yōu)橹付ㄩL(zhǎng)度的大小/
(62)、int ftruncate(int filedes,off_t length)
/這個(gè)函數(shù)用來(lái)截?cái)辔募沟靡粋€(gè)已經(jīng)存在的文件大小變?yōu)橹付ㄩL(zhǎng)度的大小/
(63)、int truncate(const char* pathname,off_t length)
/這個(gè)函數(shù)用來(lái)改變文件的訪問(wèn)時(shí)間和修改時(shí)間/
(64)、int utime(const char* pathname,const struct utimebuf* times)
/這個(gè)函數(shù)頁(yè)用來(lái)改變文件的訪問(wèn)時(shí)間和修改時(shí)間,數(shù)組第一個(gè)用來(lái)改變文件的訪問(wèn)時(shí)間,第二個(gè)參數(shù)就是修改時(shí)間/
(65)、int utimes(const char* path,const struct timeval values[2])
/這個(gè)函數(shù)將刪除一個(gè)文件名,并減少此文件的鏈接次數(shù),如果計(jì)數(shù)為0,那么文件內(nèi)容被刪除/
(66)、int unlink(const char* pathname)
/這個(gè)函數(shù)將刪除一個(gè)目錄/
(67)、int rmdir(const char* pathname)
/這個(gè)函數(shù)既可以用來(lái)刪除文件,也可以用來(lái)刪除目錄/
(68)、int remove(const char* pathname)
/這個(gè)函數(shù)用來(lái)修改文件名和目錄名/
(69)、int rename(const char* oldname,const char* newname)
/這個(gè)函數(shù)將得到進(jìn)程的當(dāng)前工作目錄/
(70)、char* getwd(char* pathbuf)
/這個(gè)函數(shù)比較厲害,可以改變進(jìn)程的工作目錄到指定的目錄,對(duì)父進(jìn)程沒(méi)有影響/
(71)、int chdir(const char* pathname)
/這個(gè)函數(shù)則實(shí)現(xiàn)和chdir一樣,只是參數(shù)不一樣/
(72)、int fchdir(int filedes)
/這個(gè)函數(shù)將創(chuàng)建一個(gè)目錄/
(73)、int mkdir(const char* pathname,mode_t mode)
/目錄也是一種文件,所以可以讀目錄流,該函數(shù)是第一步,即打開(kāi)目錄,返回指向其DIR的指針/
(74)、DIR* opendir(const char* dirname)
/這個(gè)函數(shù)讀取目錄DIR中的一個(gè)目錄,而且使得指向下一項(xiàng)/
(75)、struct dirent* readdir(DIR* dirp)
/函數(shù)關(guān)閉一個(gè)目錄流/
(76)、closedir(DIR* dirp)
/該函數(shù)將恢復(fù)dirp所指向的目錄流指向第一項(xiàng)目錄/
(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;
/這個(gè)函數(shù)將返回指定名字的環(huán)境的值/
(81)、char* getenv(const char* name)
/該函數(shù)可以用來(lái)設(shè)置一個(gè)環(huán)境變量或者去掉一個(gè)環(huán)境變量/
(82)、int putenv(char* str)//the str just like=>name=value
/這個(gè)函數(shù)將終止進(jìn)程/
(83)、void exit(int status)
/這個(gè)函數(shù)將流產(chǎn)進(jìn)程,因?yàn)樵摵瘮?shù)將生成一個(gè)轉(zhuǎn)儲(chǔ)文件/
(84)、void abort()
/這個(gè)函數(shù)將實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存/
(85)、void* malloc(sise_t size)
/這個(gè)函數(shù)和malloc一樣,只是常用來(lái)為結(jié)構(gòu)體分配內(nèi)存/
(86)、void* calloc(size_t num_of_elem,size_t ele_size)
/這個(gè)函數(shù)用來(lái)重新分配村內(nèi),需要十分小心的使用/
(87)、void* realloc(void* ptr,size_t newsize)
/這個(gè)函數(shù)釋放動(dòng)態(tài)分配的內(nèi)存/
(88)、void free(void* ptr)
/這個(gè)函數(shù)將獲得進(jìn)程的資源限制,resource 參數(shù)指明那種資源/
(89)、int getrlimit(int resource,struct rlimit* rlptr)
/這個(gè)函數(shù)用來(lái)設(shè)置進(jìn)程資源限制,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
};
/這個(gè)函數(shù)用來(lái)獲取進(jìn)程的資源使用情況,比如用了多少cpu,缺頁(yè)次數(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;
}
/這個(gè)函數(shù)將返回用戶名/
(92)、char* getlogin()
/這個(gè)函數(shù)將返回進(jìn)程的實(shí)際用戶id/
(93)、uid_t getuid()
/這個(gè)函數(shù)將返回進(jìn)程的有效用戶id/
(94)、uid_t geteuid()
/函數(shù)將返回進(jìn)程的實(shí)際組id/
(95)、gid_t getgid()
/函數(shù)返回進(jìn)程的有效組id/
(96)、gid_t getegid()
/獲取進(jìn)程id和父進(jìn)程id/
(97)、pid_t getpid()|getppid()
/創(chuàng)建進(jìn)程/
(98)、pid_t fork()//返回0表示是子進(jìn)程,其他表示父進(jìn)程
/這個(gè)函數(shù)將等待進(jìn)程完成/
(99)、pid_t wait(int stat_loc)|pid_t waitpid(pid_t pid,int stat_loc,int options)
/這個(gè)函數(shù)將執(zhí)行一個(gè)新程序/
(100)、int system(const char* command)
/這個(gè)函數(shù)將信號(hào)數(shù)signo對(duì)于的描述信息,如果msg不是空指針的話,那么函數(shù)將用這個(gè)msg作為前綴輸出/
(101)、void psignal(int signo,char* msg)
/這個(gè)函數(shù)將簡(jiǎn)單的發(fā)送一個(gè)信號(hào)給調(diào)用他的進(jìn)程/
(102)、int raise(int signo)
/這個(gè)函數(shù)將發(fā)送一個(gè)信號(hào)給一個(gè)進(jìn)程或者一個(gè)進(jìn)程組,sig指明要發(fā)送的信號(hào)/
(103)、int kill(pid_t pid,int sig)
/我們當(dāng)然可以設(shè)置信號(hào)的動(dòng)作,所以下面這個(gè)函數(shù)用來(lái)設(shè)置信號(hào)發(fā)生時(shí)的動(dòng)作,[void(sighandler_t)(int)]/
(104)、sighandler_t signal(int signum,sighandler_t handler)
/還有一個(gè)函數(shù)可以設(shè)置信號(hào)動(dòng)作,這個(gè)函數(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ù)完成信號(hào)集操作
(106)、int sigemptyset(sigset_t* set) //將set清空
(107)、int sigfillset(sigset_t* set)//使得set包含所有信號(hào),和sigemptyset是相反的
(108)、int sigaddset(sigset_t* set,int signo) //將信號(hào)signo加到set集合里面去
(109)、int sigdelset(sigset_t* set,int signo) //將信號(hào)signo從set里面移除
(110)、int sigismember(const sigset_tset,int signo) //查看signo信號(hào)是不是在信號(hào)集合set里面
/該函數(shù)將設(shè)置進(jìn)程想要阻塞的信號(hào)/
(111)、int sigprocmask(int how,const sigset_t set,sigset_t* oset)
/已經(jīng)發(fā)生但是還未交付的信號(hào)稱(chēng)為懸掛信號(hào),我們可以用這個(gè)函數(shù)來(lái)檢測(cè)是否有懸掛信號(hào),參數(shù)就是返回的懸掛信號(hào)集合/
(112)、int sigpending(sigset_t* set)
/這個(gè)函數(shù)用來(lái)等待信號(hào),簡(jiǎn)單的懸掛進(jìn)程知道信號(hào)到達(dá)/
(113)、int pause()
/這個(gè)函數(shù)將更加高級(jí),可以指定那些我們不關(guān)心的信號(hào),所以只有當(dāng)出現(xiàn)不包含在參數(shù)信號(hào)集合里面的信號(hào)時(shí),才會(huì)喚醒進(jìn)程/
(114)、int sigsuspend(const sigset_t* sigmask)
/這個(gè)函數(shù)將返回unix紀(jì)元(總秒數(shù)),如果loc是非空指針,那么loc里面也將會(huì)有一個(gè)副本/
(115)、time_t time(time_t* loc)
/這個(gè)函數(shù)將計(jì)算兩個(gè)時(shí)間之間的差,結(jié)果作為雙精度浮點(diǎn)返回/
(116)、double difftime(time_t time1,time_t time2)
//--set-- 下面的函數(shù)將是以微妙為單位的
(117)、int gettimeofday(struct timeval* restrict tp,void* restrict tzp)//將返回描述和微妙數(shù)在第一個(gè)參數(shù)里面,我們不需要知道第二個(gè)參數(shù)(時(shí)區(qū))
(118)、int settimeofdat(const struct timeval* tp,const void* tzp) //這個(gè)函數(shù)將設(shè)置當(dāng)前時(shí)間為tp,當(dāng)然只有特權(quán)用戶才有這樣的資格
(119)、int adjtime(const struct timeval* delta,struct timeval* olddelta) //對(duì)時(shí)鐘做微調(diào),如果為負(fù)數(shù),則系統(tǒng)將走慢一點(diǎn)直到過(guò)去那么多時(shí)間
//--set-- 下面這組函數(shù)是對(duì)上面函數(shù)的操作,也就是將描述或者微妙數(shù)轉(zhuǎn)換為tm結(jié)構(gòu)
(120)、struct tm* gmtime(const time_t* time) //你需要提供一個(gè)time_t類(lèi)型的指針,函數(shù)將這個(gè)指針?biāo)赶虻臅r(shí)間轉(zhuǎn)換為tm
(121)、struct tm* localtime(const time_t* time) //這個(gè)函數(shù)將time轉(zhuǎn)換為本地時(shí)間,很復(fù)雜,但是使用很簡(jiǎn)單
(122)、time_t mktime(struct tm* brokentime) //這個(gè)函數(shù)將tm結(jié)構(gòu)的時(shí)間轉(zhuǎn)換為time_t類(lèi)型
//--set-- unix提供了可以將tm或者time_t時(shí)間轉(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時(shí)間和墻鐘時(shí)間,cpu時(shí)間也就是進(jìn)程實(shí)際占用cpu運(yùn)行的時(shí)間,而墻鐘時(shí)間則是從進(jìn)程開(kāi)始便開(kāi)始計(jì)時(shí)的
//--comment-- 所以墻鐘時(shí)間可能包含有其他進(jìn)程運(yùn)行的時(shí)間,當(dāng)然,cpu時(shí)間又分為用戶時(shí)間和系統(tǒng)時(shí)間,用戶時(shí)間就是cpu執(zhí)行
//--comment-- 用戶指令的時(shí)間,而系統(tǒng)時(shí)間就是系統(tǒng)為執(zhí)行進(jìn)程而運(yùn)行的一些時(shí)間,比如系統(tǒng)調(diào)用時(shí)間
/這個(gè)函數(shù)將返回進(jìn)程當(dāng)前的cpu時(shí)間,包括用戶時(shí)間和系統(tǒng)時(shí)間/
(125)、clocl_t clock() //clock_t 表示系統(tǒng)內(nèi)部使用的時(shí)間單位,為了將返回時(shí)間變?yōu)槊耄枰訡LOCK_PER_SEC
/這個(gè)函數(shù)報(bào)告更加詳細(xì)的cpu時(shí)間,包括自己用去的時(shí)間,系統(tǒng)為自己服務(wù)用去的時(shí)間,子進(jìn)程的時(shí)間,同時(shí)還返回系統(tǒng)當(dāng)前的墻鐘時(shí)間/
(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
}
/這個(gè)函數(shù)將使得進(jìn)程睡眠一段時(shí)間,它掛起調(diào)用進(jìn)程直到發(fā)生下面的事情:(1)、時(shí)間到(2)、信號(hào)到/
(127)、unsigned int sleep(unsigned int seconds) //注意,參數(shù)單位是秒,不是微妙
/這個(gè)函數(shù)用來(lái)設(shè)置一次性的定時(shí),只能設(shè)置墻鐘時(shí)間,到期會(huì)生成SIGALRM信號(hào),如果進(jìn)程沒(méi)有捕捉該信號(hào),默認(rèn)會(huì)結(jié)束該進(jìn)程/
(128)、unsigned int alarm(unsigned int seconds)
//--set-- 下面的函數(shù)可以用來(lái)設(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;//定時(shí)器的間隔時(shí)間
struct timeval it_value;//定時(shí)器的開(kāi)始時(shí)間
}
//--comment-- 關(guān)于實(shí)時(shí)時(shí)鐘,系統(tǒng)定義的實(shí)時(shí)時(shí)鐘有幾種類(lèi)型,可以查看相關(guān)內(nèi)容
//-|structure define|-
struct timespec{
time_t tv_sec;//秒數(shù)
long tv_nsec;//不足一秒的納秒數(shù)
};
//--set-- 下面的函數(shù)將用來(lái)獲取或者設(shè)置實(shí)時(shí)時(shí)鐘
(131)、int clock_getres(clockid_t clock_id,struct timespec* res) //該函數(shù)將返回指定時(shí)鐘的分辨率,保存在res里面
(132)、int clock_gettime(clockid_t clock_id,struct timespec* tp) //返回指定實(shí)時(shí)時(shí)鐘的時(shí)間,保存在tp里面
(133)、int clock_settime(clockid_t clock_id,const struct timespec* tp) //設(shè)置實(shí)時(shí)時(shí)鐘,只有特權(quán)用戶可以
/一種時(shí)間更短的睡眠/
(134)、int nanosleep(const struct timespec* res,struct timespec* rem) //睡眠res時(shí)間,如果有信號(hào)來(lái)了,將剩余時(shí)間保存在rem里面
//--comment-- 實(shí)時(shí)定時(shí)器,分辨率更高
//-|structure define|-
struct itimerspec
{
struct timespec it_value;//定時(shí)開(kāi)始時(shí)間
struct timespec it_interval;//定時(shí)間隔
}
//--set-- 下面的函數(shù)將實(shí)現(xiàn)創(chuàng)建和刪除實(shí)時(shí)定時(shí)器
(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í)次數(shù)
/這個(gè)函數(shù)在前面已經(jīng)有介紹,但是這里作為設(shè)置文件鎖而特別指出/
(140)、int fcntl(int fildes,int cmd,struct flock* lock)
/*
關(guān)于信號(hào)驅(qū)動(dòng)的IO:采用信號(hào)驅(qū)動(dòng)的IO,則當(dāng)在描數(shù)字上有數(shù)據(jù)到達(dá)時(shí),進(jìn)程會(huì)收到一個(gè)信號(hào),此時(shí)對(duì)
該描數(shù)字進(jìn)行輸入輸出操作將不會(huì)被阻塞。
下面是實(shí)現(xiàn)信號(hào)驅(qū)動(dòng)的IO的步驟:
(1)、調(diào)用sigaction函數(shù)來(lái)建立信號(hào)句柄
(2)、調(diào)用fcntl函數(shù)用F_SETOWN來(lái)設(shè)置接收信號(hào)的進(jìn)程或者進(jìn)程組
(3)、如果要接收的信號(hào)是SIGIO,需要調(diào)用fcntl函數(shù)用F_SETTFL命令設(shè)置文件描數(shù)字的O_ASYNC標(biāo)志使其能夠生成SIGIO信號(hào)
/
/下面這個(gè)函數(shù)功能很強(qiáng)大,他告訴內(nèi)核,需要等待多種IO事件,只有當(dāng)這些中的一個(gè)或者多個(gè)出現(xiàn)時(shí),或者指定的時(shí)間過(guò)去時(shí),才喚醒調(diào)用他的進(jìn)程/
(141)、int select(int nfds,fd_set rfds,fd_set* wfds,fd_set* efds,struct timeval* timeout)
關(guān)于上面這個(gè)函數(shù),函數(shù)將返回已經(jīng)就緒的描數(shù)字的個(gè)數(shù),或者超時(shí)出返回-1
我們可以用下面的宏定義來(lái)查看一些細(xì)節(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) //加入
/下面這個(gè)函數(shù)和select函數(shù)一樣,檢查一組文件描數(shù)字,查看是否有任何懸掛的事件,并且可以有選擇的為某個(gè)描數(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 是用戶對(duì)這個(gè)文件描數(shù)字上感興趣的事情,而revents是這個(gè)文件描數(shù)字上實(shí)際發(fā)生的事件。
* 也就是函數(shù)的返回值,最后一個(gè)參數(shù)為最長(zhǎng)的等待時(shí)間,單位時(shí)毫秒
*/
/*下面這個(gè)函數(shù)可以將一個(gè)文件映射到內(nèi)存,應(yīng)當(dāng)首先用open打開(kāi),然后調(diào)用下面這個(gè)函數(shù)*/
(143)、void* mmap(void* addr,size_t len,int prot,int flags,int filedes,off_t off)
///--- 上面函數(shù)實(shí)現(xiàn)將指定文件描數(shù)字filedes中的文件的[off,off+len]區(qū)間映射到進(jìn)程的內(nèi)存
///--- [paddr,paddr+len]區(qū)間,paddr是函數(shù)的返回值。也就是最終的映射到進(jìn)程的開(kāi)始地址
///--- 那么addr是什么玩意呢?也就是自己指定映射的開(kāi)始位置,如果為0,那么內(nèi)核將找到合適的
///--- 位置然后告訴進(jìn)程我把文件映射到了哪里!
///--- 其中,prot是映射區(qū)的保護(hù)權(quán)限,應(yīng)該和open時(shí)指定的權(quán)限一致。
///--- flags是映射區(qū)的屬性,必須要么是共享的,要么是私有的,還可以加上是否必須返回addr
/當(dāng)然,有映射自然會(huì)有解映射,下面這個(gè)函數(shù)是,mmap的相反函數(shù)/
(144)、int mumap(void* paddr,size_t len)
///--- paddr應(yīng)該是mmap返回的結(jié)果,len是映射區(qū)的長(zhǎng)度。
/對(duì)于屬性為共享的存儲(chǔ)映射區(qū),當(dāng)映射區(qū)的一頁(yè)被修改時(shí),會(huì)被存回硬盤(pán),如果想要在程序的某個(gè)點(diǎn)將其中的內(nèi)容寫(xiě)到磁盤(pán),下面這個(gè)函數(shù)可以/
(145)、 int msync(void* addr,size_t len,int flags)
///--- flags參數(shù)控制寫(xiě)回這片區(qū)域的執(zhí)行方式,可以取下面三個(gè)
///--- MS_ASYNC -->異步執(zhí)行
///--- MS_SYNC -->同步執(zhí)行,完成函數(shù)才會(huì)返回
///--- MS_INVALIDATE -->作廢與指定映射區(qū)中的數(shù)據(jù)不一致的緩存副本
/下面這個(gè)函數(shù)用來(lái)創(chuàng)建一根管道,函數(shù)將返回兩個(gè)文件描數(shù)字,分別是管道的輸入輸出端/
(146)、int pipe(int fildes[2])
///--- fildes[0] 將設(shè)置為讀而打開(kāi),dildes[1]將設(shè)置為寫(xiě)而打開(kāi)
///--- 管道是沒(méi)有名字的,所以叫做匿名管道
/下面這個(gè)函數(shù)關(guān)于在調(diào)用進(jìn)程與要執(zhí)行的命令之間建立一個(gè)內(nèi)部的半雙工的管道,然后派生一個(gè)子進(jìn)程,執(zhí)行command命令/
///--- 需要注意是,這和system函數(shù)還是有區(qū)別的,system函數(shù)將等待執(zhí)行完成再返回,而該函數(shù)將立即返回
(147)、FILE* popen(const char* command,const char* mode)
/用popen打開(kāi)的管道需要用下面的函數(shù)來(lái)關(guān)閉/
(148)、int pclose(FILE* stream)
///--- 管道只能用于父子進(jìn)程之間的通信,因?yàn)楣艿澜⒃趦?nèi)核之中,只有那些有遺傳關(guān)系的進(jìn)程才能用到它
///--- FIFO特別文件可以在非父子關(guān)系的進(jìn)程之間實(shí)現(xiàn)數(shù)據(jù)交換
///--- 對(duì)于FIFO特別文件來(lái)說(shuō),只要文件被打開(kāi),他的行為就和管道是一樣的。
///--- 在進(jìn)行通信之前,需要有一個(gè)進(jìn)程以讀打開(kāi)這個(gè)fifo文件,另一個(gè)進(jìn)程以寫(xiě)打開(kāi)這個(gè)fifo特別文件
/這個(gè)函數(shù)將創(chuàng)建一個(gè)名字為filename的fifo文件/
(149)、int mkfifo(const char* filename,mode_t mode)
/這個(gè)函數(shù)更加強(qiáng)大,不僅可以創(chuàng)建fifo文件,還可以創(chuàng)建其他的文件,文件類(lèi)型由mode給出/
(150)、int mknod(const char* filename,mode_t mode,dev_t dev)
/下面這個(gè)函數(shù)可以用來(lái)創(chuàng)建獲得消息隊(duì)列,函數(shù)調(diào)用成功會(huì)返回與key相連的id,我們可以用id來(lái)訪問(wèn)消息隊(duì)列/
(151)、int msgget(key_t key,int flags)
/消息隊(duì)列的查詢、設(shè)置和刪除/
(152)、 int msgctl(int msqid,int cmd,struct msqid_ds* buf)
///--- cmd 就是我們想要做的事情,可以取下面的值---
///--- IPC_STAT --> 復(fù)制消息隊(duì)列的內(nèi)核數(shù)據(jù)結(jié)構(gòu)到buf里面
///--- IPC_SET -->用buf里面的值設(shè)置消息隊(duì)列
///--- IPC_RMID --> 刪除指定的消息隊(duì)列
/下面這個(gè)函數(shù)實(shí)現(xiàn)向一個(gè)消息隊(duì)列發(fā)送消息/
(153)、 int msgsnd(int msqid,const void* msgp,size_t msgze,int msgflg)
///--- 第一個(gè)參數(shù)是消息隊(duì)列的id,第二個(gè)參數(shù)是指向消息緩沖區(qū)的指針,第三個(gè)參數(shù)給出消息緩沖區(qū)的消息正文的字節(jié)數(shù)
///--- 不包括消息類(lèi)型成員(第一個(gè)成員),最后一個(gè)參數(shù)用來(lái)引導(dǎo)當(dāng)進(jìn)程阻塞時(shí)的動(dòng)作
/下面這個(gè)函數(shù)用來(lái)接收消息/
(154)、ssize_t msgrcv(int msqid,void* msgp,size_t msgsz,long int msgtyp,int msgflg)
///---這個(gè)函數(shù)從消息隊(duì)列msqid里面讀消息到msgp里面,msgsz指出消息正文的字節(jié)數(shù),msgtyp指明要接收的消息類(lèi)型
///--- --> =0 接收消息隊(duì)列里面的第一個(gè)消息
///--- --> >0 接收類(lèi)型等于msgtyp的第一個(gè)消息,這種方式可實(shí)現(xiàn)只接收特定類(lèi)型的消息
///--- --> <0 接收類(lèi)型小于或者等于msgtyp絕對(duì)值的第一個(gè)最低類(lèi)型的消息,實(shí)現(xiàn)優(yōu)先級(jí)
/下面這個(gè)函數(shù)將實(shí)現(xiàn)創(chuàng)建和獲得共享存儲(chǔ)段/
(155)、int shmget(key_t key,size_t size,int shmflg)
/共享存儲(chǔ)段的查詢、設(shè)置、刪除/
(156)、int shmctl(int shmid,int cmd,struct shmid_ds* buf)
/創(chuàng)建好了共享存儲(chǔ)段之后,我們還需要將它映射到進(jìn)程的地址空間,下面這個(gè)函數(shù)可以實(shí)現(xiàn)這個(gè)功能/
(157)、void* shmat(int shmid,const void* shmaddr,int shmflg)
///--- 溫馨提示:為了簡(jiǎn)單,shmaddr就讓他等于0吧,剩下的事情讓操作系統(tǒng)為你完成
/創(chuàng)建和獲得信號(hào)量/
(158)、int semget(key_t key,int nsems,int semflg)
///--- nsems指明信號(hào)量集合中信號(hào)量的個(gè)數(shù)
/信號(hào)量的查詢、設(shè)置、刪除/
(159)、int semctl(int semid,int semnum,int cmd,[union semun arg])
///--- semid是信號(hào)量集合的標(biāo)志,semnum指明一個(gè)特定的信號(hào)量
/信號(hào)量操作/
(160)、int semop(int semid,struct sembuf* sops,size_t nsops)
///--- 該函數(shù)對(duì)指定的semid信號(hào)量集合進(jìn)行操作,操作既可以對(duì)其中的一個(gè)信號(hào)量,也可以針對(duì)整個(gè)信號(hào)量還可以
///--- 是等待信號(hào)量,sops給出操作類(lèi)型
//-|structure define|-
struct sembuf
{
unsigned short int sem_num;//信號(hào)量編號(hào)
short int sem_op;//信號(hào)量操作
short int sem_flg;//信號(hào)量標(biāo)志
}
///--- sem_op
///--- <0 減少一個(gè)信號(hào)量,減少的值為abs(sem_op),當(dāng)為-1時(shí),相當(dāng)于P操作
///--- >0 增加一個(gè)信號(hào)量,增加的值為sem_op,當(dāng)為1時(shí),相當(dāng)于V操作
///--- ==0 等待信號(hào)量變?yōu)?
///--- 注意:semop()函數(shù)調(diào)用只有當(dāng)集合中所有信號(hào)量都能成功時(shí)才成功返回,如果某個(gè)信號(hào)量不能完成,失敗!
//套接字等價(jià)于網(wǎng)絡(luò),就好像文件描數(shù)字是磁盤(pán)描述的一個(gè)端口一樣。我們可以用下面的函數(shù)來(lái)創(chuàng)建一個(gè)網(wǎng)絡(luò)套接字
(161)、int socket(int domain,int type,int protocol)
///---socket 將和文件描數(shù)字一樣會(huì)返回最小的還沒(méi)有被使用的套接字描數(shù)字
///---第一個(gè)參數(shù)domain指明通信域:可以為AF_UNIX,AF_INET,AF_INET6
///---第二個(gè)參數(shù)是套接字的類(lèi)型,可以為:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW.
///---對(duì)于第三個(gè)參數(shù),只要前兩個(gè)參數(shù)確定了,就可以確定第三個(gè)參數(shù)也就是協(xié)議了,所以只需要填0就可以了
/下面的函數(shù)可以實(shí)現(xiàn)同時(shí)創(chuàng)建一對(duì)套接字描數(shù)字,是全雙工的/
(162)、int socketpair(int domain,int type,int protocol,int filedes[])
/下面這個(gè)函數(shù)用來(lái)關(guān)閉一個(gè)已經(jīng)打開(kāi)的套接字描數(shù)字,黨我們關(guān)閉了一個(gè)套接字之和,這個(gè)套接字便不再存在/
(163)、int close(int socket)
/當(dāng)我們這是想斷開(kāi)連接而不是關(guān)閉一個(gè)套接字,那么可以用下面這個(gè)函數(shù)來(lái)實(shí)現(xiàn)/
(164)、int shutdown(int socket,int how)
///---這個(gè)函數(shù)將部分或者全部斷開(kāi)套接字socket的連接,取決于how的值是什么
///---SHUT_RD:停止從該套接字接收數(shù)據(jù)
///---SHUT_WR:停止從該套接字傳送數(shù)據(jù)
///---SHUT_RDWR:停止從該套接字傳輸和接收數(shù)據(jù)
/下面這組函數(shù)將實(shí)現(xiàn)ip地址的格式轉(zhuǎn)換,可以從二進(jìn)制形式轉(zhuǎn)換為點(diǎn)分十進(jìn)制形式,也可以向相反的方向轉(zhuǎn)換/
(165)、int inet_aton(const char* name,struct in_addr* addr) //從字符串轉(zhuǎn)換到二進(jì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里面,用了一個(gè)主機(jī)網(wǎng)絡(luò)地址數(shù)據(jù)庫(kù)來(lái)記住主機(jī)名和主機(jī)ip地址之間的映射
//我們可以用下面的函數(shù)來(lái)從這個(gè)數(shù)據(jù)庫(kù)中獲得一臺(tái)主機(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
/我們可以用下面的這個(gè)函數(shù)來(lái)打開(kāi)地址數(shù)據(jù)庫(kù),當(dāng)參數(shù)為不為0時(shí),將會(huì)和數(shù)據(jù)庫(kù)建立持久連接/
(170)、void sethostent(int stayopen)
(171)、struct hostent* gethostent();
(172)、void endhostent(); //關(guān)閉數(shù)據(jù)庫(kù)
///--我們知道有一些默認(rèn)的應(yīng)用是綁定到了固定的端口上的,比如21號(hào)端口就是用來(lái)進(jìn)行FTP服務(wù)的,我們
///---可以通過(guò)下面的函數(shù)來(lái)查看一些著名的服務(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()
///---下面是很煩很無(wú)聊的字節(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)該會(huì)創(chuàng)建一個(gè)套接字描數(shù)字,然后也了解了ip地址,套接字等內(nèi)容,下面我們需要給套機(jī)字一個(gè)名字
///---當(dāng)套接字有了名字之和,我們就可以使用套機(jī)字名字來(lái)操作這個(gè)套機(jī)字了,也就是說(shuō),套機(jī)字沒(méi)有名字,其他進(jìn)程根本
///---無(wú)法訪問(wèn)到這個(gè)沒(méi)有名字的套接字,所以我們需要給他一個(gè)名字,下面這個(gè)函數(shù)可以實(shí)現(xiàn)將一個(gè)套接字綁定在一個(gè)名字上
(182)、int bind(int socket,const struct sockaddr* address,socklen_t address_len)
///---現(xiàn)在我們先來(lái)了解一下套機(jī)字是怎么工作的:首先用socket函數(shù)創(chuàng)建一個(gè)套接字描數(shù)字,然后調(diào)用bind函數(shù)來(lái)給
///---這個(gè)套接字綁定一個(gè)名字,以便其他進(jìn)程可以訪問(wèn)這個(gè)套接字。然后用listen來(lái)監(jiān)聽(tīng)這個(gè)套接字上的活動(dòng),在多個(gè)
///---客戶與該套接字建立連接的情況下,listen函數(shù)為進(jìn)入該套接字的連接創(chuàng)建一個(gè)連接隊(duì)列,然后調(diào)用accept函數(shù)
///---逐一處理這些連接,需要知道的是,每次調(diào)用accept函數(shù),系統(tǒng)都將創(chuàng)建一個(gè)新的套接字,但是這個(gè)新的套接字將
///---只用于與特定的客戶連接,所以不需要命名,那已經(jīng)命名的套接字保留用于與其他用戶連接,這樣就可以實(shí)現(xiàn)
///---一個(gè)套接字描數(shù)字和多個(gè)客戶通信的需求了---->以上言論對(duì)有連接的套接字通信有效
///---對(duì)于無(wú)連接的套接字通信,事情變得很簡(jiǎn)單,他使用對(duì)等的方式來(lái)進(jìn)行數(shù)據(jù)交換,但是依然需要bind一個(gè)名字
///---然后事情就在recvfrom和sendto這兩個(gè)函數(shù)之間變得有趣了!
//下面這個(gè)函數(shù)是對(duì)于流套接字操作而言的,而且這個(gè)函數(shù)用于客戶端請(qǐng)求與服務(wù)端建立一個(gè)連接
(183)、int connect(int socket,const struct sockaddr* address,socklen_t address_len)
//下面函數(shù)可以在套接字上創(chuàng)建偵探隊(duì)列,成功后這個(gè)套接字將稱(chēng)為被動(dòng)套接字,也就是服務(wù)套機(jī)字
(184)、int listen(int socket,int backlog) //backlog指明該套接字上可以懸掛的請(qǐng)求連接數(shù)
//下面函數(shù)將會(huì)創(chuàng)建一個(gè)新的套機(jī)字來(lái)為客戶服務(wù),函數(shù)將返回新套接字的描數(shù)字,后兩個(gè)參數(shù)將作為返回
(185)、int accept(int socket,struct sockaddr* address,socklen_t* address_len)
//兩個(gè)套接字建立連接之和,我們可以通過(guò)下面的函數(shù)來(lái)查看對(duì)方套機(jī)字地址和本地套機(jī)字地址
(186)、int getsockname(int socket,struct socketaddr* address,socklen_t* address_len) //獲取本地
(187)、int getpeername(int sock,struct sockaddr* address,socklen_t* address_len) //獲取對(duì)方的
/我們應(yīng)該知道,套接字也是一種文件,所以可以像操作文件一樣操作套接字,write和read可以用來(lái)從一個(gè)套接字讀取數(shù)據(jù)和發(fā)送數(shù)據(jù)/
///---下面的函數(shù)也可以實(shí)現(xiàn)向一個(gè)套接字發(fā)送數(shù)據(jù)或者從套接字讀取數(shù)據(jù)
(188)、ssize_t send(int socket,const void* buffer,size_t length,int flags)
///---需要注意的是最后一個(gè)參數(shù),如果最后一個(gè)參數(shù)為0,那么就和write一樣了,當(dāng)然這個(gè)標(biāo)志可以取下面的值
///---MSG_OOB:使得send發(fā)送的數(shù)據(jù)稱(chēng)為帶外數(shù)據(jù)
///---MSG_DONTROUTE:不再消息中包含路由信息
(189)、ssize_t recv(int socket,void* buffer,size_t length,int flags)
///---最后一個(gè)參數(shù)要是取0的話,和read是一樣的
///---MSG_PEEK:窺視套接字上的數(shù)據(jù)但是不讀取他們
///---MSG_OOB:讀帶外數(shù)據(jù)
///---MSG_WAITALL:函數(shù)將阻塞直到讀到所請(qǐng)求的全部數(shù)據(jù)
/下面的函數(shù)將可以查看和設(shè)置套接字的各自選項(xiàng)/
(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)打開(kāi)的套接字,level指出所選擇的層次,可以是下面的值
///---SOL_SOCKET,IPPOTO_IP,IPPOTO_TCP
///---optname指出選項(xiàng)的名字,對(duì)于getsockopt來(lái)說(shuō),函數(shù)將讀取名字為optname的選擇,將讀出來(lái)的值
///---保存在optval里面,對(duì)于設(shè)置來(lái)說(shuō),需要自己指定optval
///---選項(xiàng)可以查看相應(yīng)的文檔獲得
/下面這個(gè)函數(shù)可以判斷當(dāng)前是否處在帶外數(shù)據(jù)標(biāo)志的位置/
(192)、int sockatmark(int sockfd)
///---(1)、當(dāng)下一個(gè)要讀的字節(jié)是oob時(shí),函數(shù)返回真
///---(2)、讀操作總是停止在帶外數(shù)據(jù)標(biāo)志之處
/下面這兩個(gè)函數(shù)可以實(shí)現(xiàn)對(duì)數(shù)據(jù)報(bào)套接字的數(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)
///---需要特別說(shuō)明,數(shù)據(jù)報(bào)套接字也可以使用connect函數(shù),但是對(duì)于數(shù)據(jù)報(bào)套接字來(lái)說(shuō)這個(gè)函數(shù)并不會(huì)建立連接
///---而只是給將來(lái)在此套接字上的傳送指定地址,內(nèi)核將記錄對(duì)等套接字的ip地址和端口,這樣我們就可以不用
///---recvfrom和sendto函數(shù)了,可以使用read或者recv或者write或者send函數(shù)了
/下面的函數(shù)可以查看一個(gè)線程自己的線程id,需要知道的是線程也有線程id,而且在一個(gè)進(jìn)程里面的每一個(gè)線程都具有不一樣的線程id/
(195)、pthread_t pthread_self()
/下面這個(gè)函數(shù)可以用來(lái)比較倆個(gè)線程id,兩個(gè)線程id相同時(shí)返回非0,不同時(shí)返回0/
(196)、int pthread_equal(pthread_t t1,pthread_t t2)
/下面這個(gè)函數(shù)用來(lái)創(chuàng)建一個(gè)新的線程/
(197)、int pthread_create(pthread_t restrict thread,const pthread_attr_t restrict attr,
void(start_routine)(void),void restrict argv)
///---每一個(gè)進(jìn)程一開(kāi)始就會(huì)有一個(gè)線程,稱(chēng)為初始線程,或者叫做主線程,他是從main函數(shù)開(kāi)始的,進(jìn)程中的其他
///---線程在創(chuàng)建線程時(shí)指定一個(gè)線程開(kāi)始函數(shù),這個(gè)線程開(kāi)始函數(shù)只能有一個(gè)void*的參數(shù),這個(gè)新創(chuàng)建的線程將
///---從這個(gè)函數(shù)開(kāi)始執(zhí)行
///--第一個(gè)參數(shù)是函數(shù)的返回值,函數(shù)調(diào)用成功將返回這個(gè)新創(chuàng)建的線程的id,第二個(gè)參數(shù)指定新創(chuàng)建的線程的屬性
/下面這個(gè)函數(shù)將終止線程,也就是終止自己的執(zhí)行/
(198)、int pthread_exit(void* value_ptr)
///---參數(shù)應(yīng)該是一個(gè)出口狀態(tài),當(dāng)其他的線程在等待這個(gè)線程時(shí),當(dāng)這個(gè)線程結(jié)束時(shí),其他等待該線程的線程將會(huì)得到這個(gè)
///---線程出口狀態(tài),然后做下一步的動(dòng)作
/下面這個(gè)函數(shù)用來(lái)等待一個(gè)線程終止/
(199)、int pthread_join(pthread_t thread,void** value_ptr)
///---該函數(shù)將懸掛調(diào)用該函數(shù)的線程直到所等待的線程終止,第二個(gè)參數(shù)將保存從等待線程返回的出口狀態(tài),該
///---線程可以根據(jù)這個(gè)出口狀態(tài)來(lái)執(zhí)行相應(yīng)的函數(shù)
///---關(guān)于可匯合線程和分離線程
///---可匯合線程:線程的資源需要另一個(gè)線程調(diào)用pthread_join與他匯合之后才能被釋放
///---分離線程:線程一旦終止,系統(tǒng)將立刻回收他的資源
/下面的函數(shù)可以將原本可匯合的線程變?yōu)榉蛛x的線程,需要知道的是,默認(rèn)創(chuàng)建的線程都是可匯合的/
(200)、int pthread_detach(pthread_t thread)
///---已經(jīng)分離的線程不能和其他線程匯合,所以一旦一個(gè)線程被設(shè)置為分離的,那么這個(gè)線程就不能被pthread_join
/下面的一組函數(shù)用來(lái)設(shè)置特殊屬性的線程/
///---線程的一般屬性包括:分離狀態(tài)屬性,棧的大小,棧地址,棧溢出保護(hù)區(qū)大小,調(diào)度屬性,調(diào)度的競(jìng)爭(zhēng)范圍,調(diào)度的繼承屬性
///---調(diào)度策略,調(diào)度參數(shù)
(201)、int pthread_attr_init(pthread_attr_t attr) //初始化一個(gè)線程屬性
(202)、int pthread_attr_destroy(pthread_attr_t attr) //銷(xiāo)毀一個(gè)線程屬性對(duì)象
(203)、int pthread_attr_getdetachstate(pthread_attr_t* attr,int* detachstate) //查詢線程屬性對(duì)象的分離狀態(tài),將返回在第二個(gè)參數(shù)里面
(204)、int pthread_attr_setdetachstate(const pthread_ttr_t* attr,int detachstate) //設(shè)置線程屬性屬性對(duì)象的分離狀態(tài)
///---下面是互斥變量的初始化和銷(xiāo)毀
(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)在有兩種屬性,一種是進(jìn)程共享屬性,和類(lèi)型屬性
///---共享屬性設(shè)置一個(gè)互斥鎖是否可以在進(jìn)程之間使用
///---下面的函數(shù)是和互斥變量屬性相關(guān)的函數(shù)
(208)、int pthread_mutexattr_init(pthread_mutexattr_t * attr) //初始化一個(gè)互斥變量屬性
(209)、int pthread_mutexattr_destroy(pthread_mutexattr_t* attr) //銷(xiāo)毀一個(gè)互斥變量屬性
///---下面兩組函數(shù)可以用來(lái)設(shè)置互斥變量的進(jìn)程共享屬性和類(lèi)型屬性
(210)、int pthread_mutexattr_setpshared(pthread_mutexattr_t* attr,int pshared) //設(shè)置進(jìn)程共享屬性
(211)、int pthread_mutexattr_getpshared(pthread_mutexattr_t* attr,int *restrict pshared) //查看互斥變量的進(jìn)程共享屬性
(212)、int pthread_mutexattr_settype(pthread_mutexattr_t* attr,int pshared) //設(shè)置互斥變量類(lèi)型屬性
(213)、int pthread_mutexattr_hettype(pthread_mutexattr_t* attr,int * restrict type)
///--下面的函數(shù)用來(lái)對(duì)互斥變量加鎖或者解鎖
(214)、int pthread_mutex_lock(pthread_mutex_t* mutex) //上鎖,但是如果失敗,等待直到獲得鎖才返回
(215)、int pthread_mutex_trylock(pthread_mutex_t* mutex)//如果上鎖失敗的話,立刻返回錯(cuò)誤<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) //初始化一個(gè)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í),線程不需要阻塞而是可以輪詢直到獲得鎖
///---下面的函數(shù)是關(guān)于讀寫(xiě)鎖的
///---讀寫(xiě)鎖支持線程對(duì)數(shù)據(jù)的共享讀互斥寫(xiě)
///---可以以讀方式上鎖,一個(gè)線程占有這個(gè)鎖之后,還是允許其他的線程來(lái)以讀的方式上鎖
///---可以以寫(xiě)方式上鎖,一個(gè)線程占有這個(gè)鎖之后,不允許其他的鎖進(jìn)來(lái)
(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)
///---需要注意的是,讀寫(xiě)鎖只有一種屬性,可以指定為進(jìn)程之內(nèi)或者是進(jìn)程之間
///---下面的函數(shù)是關(guān)于讀寫(xiě)鎖屬性的函數(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)于讀寫(xiě)鎖的上鎖和解鎖的
(229)、int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock) //以讀方式上鎖,如果不能獲得鎖,那么受阻直到獲得鎖
(230)、int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock) //如果線程不能立刻獲得鎖的話,那么這個(gè)函數(shù)將會(huì)返回EBUSY<立刻>
(231)、int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
(232)、int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock)
///---無(wú)論讀寫(xiě)鎖是怎么加的鎖,下面這個(gè)函數(shù)都可以解開(kāi)
(234)、int pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
///---關(guān)于條件變量
///---下面的函數(shù)是關(guān)于初始化和銷(xiāo)毀條件變量的
(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)
///---等待條件變量
///---一個(gè)是執(zhí)行正常的等待操作,一個(gè)是指定定時(shí)的等待操作
(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)用這兩個(gè)函數(shù)之前mutex必須處于鎖住的狀態(tài),在這兩個(gè)函數(shù)阻塞之前,函數(shù)將會(huì)釋放mutex
///---喚醒條件變量的等待,可以有兩種方式來(lái)喚醒,一種是每次喚醒一個(gè)線程,稱(chēng)為“發(fā)信號(hào)”
///---另一種則一次喚醒等待在同一個(gè)條件變量上的所有線程,這種方式稱(chēng)為“廣播”
(244)、int pthread_cond_signal(pthread_cond_t* cond)
(245)、int pthread_cond_broadcast(pthread_cond_t* cond)
///---如果沒(méi)有線程等待在條件變量cond上面,那么這個(gè)兩個(gè)函數(shù)將沒(méi)有任何作用
///---關(guān)于線程專(zhuān)有數(shù)據(jù)鍵
(246)、int pthread_key_create(pthread_key_t * key,void(destrcutor)(void)) //函數(shù)返回在key里面
///---創(chuàng)建鍵的作用只是為每一個(gè)線程相連一個(gè)指向其專(zhuān)有存儲(chǔ)空間的指針,這些指針的初始值都是null,key一旦
///---創(chuàng)建成功,那么就可以通過(guò)函數(shù)pthread_getspecific()使之指向各自分配的專(zhuān)有數(shù)據(jù)存儲(chǔ)空間
///---第二個(gè)參數(shù)是一個(gè)析構(gòu)函數(shù),這個(gè)函數(shù)負(fù)責(zé)在線程終止時(shí)做一些回收工作,所以當(dāng)線程終止時(shí),線程會(huì)查看
///---線程專(zhuān)有數(shù)據(jù)鍵,如果上面有安裝析構(gòu)函數(shù)的話,那么就執(zhí)行這個(gè)析構(gòu)函數(shù)
///---需要注意的是,線程專(zhuān)有數(shù)據(jù)鍵只能由一個(gè)線程創(chuàng)建一次,如果多次創(chuàng)建,會(huì)丟失數(shù)據(jù)
///---下面這個(gè)函數(shù)可以保證一個(gè)專(zhuān)有數(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))
///---第二個(gè)參數(shù)是一個(gè)初始化參數(shù),pthread_once函數(shù)會(huì)記錄這個(gè)初始化函數(shù)是否已經(jīng)被調(diào)用,如果已經(jīng)被調(diào)用
///---那么任何調(diào)用pthread_once函數(shù)創(chuàng)建的數(shù)據(jù)key都將以失敗返回
///---下面的函數(shù)可以用來(lái)刪除一個(gè)專(zhuān)有數(shù)據(jù)鍵
(249)、int pthread_key_delete(pthread_key_t key)
///---對(duì)于每一個(gè)線程,當(dāng)線程專(zhuān)有數(shù)據(jù)鍵創(chuàng)建時(shí),都是null的,為了使用線程專(zhuān)有數(shù)據(jù)鍵,每一個(gè)線程需要給專(zhuān)有數(shù)據(jù)鍵指定值
///---線程專(zhuān)有數(shù)據(jù)鍵是全局的,線程內(nèi)的所有函數(shù)都能訪問(wèn),但是每一個(gè)線程與鍵相連的存儲(chǔ)空間是獨(dú)立的,因此,他們是私有的
///---也就是,他們是對(duì)線程私有的全局?jǐn)?shù)據(jù)
///---下面的函數(shù)用來(lái)設(shè)置線程的專(zhuān)有數(shù)據(jù)和訪問(wèn)線程專(zhuān)有數(shù)據(jù)
(250)、int pthread_setspecific(pthread_key_t key,const void* value) //設(shè)置value為調(diào)用線程的線程專(zhuān)有數(shù)據(jù)鍵key
(251)、void *pthread_getspecific(pthread_key_t key)//獲得鍵key對(duì)應(yīng)于調(diào)用線程的專(zhuān)有數(shù)據(jù)
///---線程與信號(hào)
///---在多線程的情況下,信號(hào)屏蔽不再是整個(gè)進(jìn)程只有一個(gè),而是每個(gè)線程一個(gè)
///---雖然所以線程共享相同的信號(hào)動(dòng)作,但是每個(gè)線程可以阻塞自己不想處理的信號(hào)
///---下面的函數(shù)用來(lái)設(shè)置信號(hào)屏蔽
(252)、int pthread_sigmask(int how,const sigset_t* set,sigset_t* oldset)
///---how->
///---SIG_BLOCK:將set添加進(jìn)來(lái)
///---SIG_UNBLOCK:將set移除
///---SIG_SETMASK:替換原來(lái)的
///---下面的函數(shù)用來(lái)向線程發(fā)送信號(hào)
///---線程向進(jìn)程發(fā)送信號(hào)任然使用kill
(253)、int pthread_kill(pthread_t thread,int aigno)
///---線程可以用下面的方式向自己發(fā)送信號(hào)
pthread_kill(pthread_self(),sig) or raise(sig)
///---等待信號(hào),在接收到信號(hào)之后直接對(duì)信號(hào)進(jìn)行處理,而不需要信號(hào)句柄
///---該函數(shù)將阻塞調(diào)用線程直到出現(xiàn)set里面的信號(hào),sig會(huì)返回信號(hào)數(shù)量
(254)、int sigwait(const sigset_t* set,int * sig)
///---要注意的是,在線程調(diào)用sigwait之前,所有線程都應(yīng)當(dāng)阻塞了信號(hào)集set中的信號(hào),否則會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果
/--2016/4/16--hujian--/