Linux API函數大全

(一)文件操做篇
一、creat(創建文件)
頭文件
1 #include 2 #include 3 #include
定義函數
1 int creat(const char * pathname, mode_tmode);
函數說明
參數pathname指向欲創建的文件路徑字符串。creat()至關於使用下列的調用方式調用open()
1 open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC));
錯誤代碼
關於參數mode請參考open()函數。
返回值
creat()會返回新的文件描述詞,如有錯誤發生則會返回-1,並把錯誤代碼設給errno。
EEXIST 參數pathname所指的文件已存在。
EACCESS 參數pathname 所指定的文件不符合所要求測試的權限
EROFS 欲打開寫入權限的文件存在於只讀文件系統內
EFAULT 參數pathname 指針超出可存取的內存空間
EINVAL 參數mode 不正確。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname爲一目錄
ENOMEM 核心內存不足
ELOOP 參數pathname有過多符號鏈接問題。
EMFILE 已達到進程可同時打開的文件數上限
ENFILE 已達到系統可同時打開的文件數上限
附加說明
creat()沒法創建特別的裝置文件,若是須要請使用mknod()。
二、open(打開文件)
頭文件
1 #include 2 #include 3 #include
定義函數
1 int open( const char * pathname, int flags); 2 int open( const char * pathname,int flags, mode_t mode);
函數說明
參數pathname 指向欲打開的文件路徑字符串。下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。
O_CREAT 若欲打開的文件不存在則自動創建該文件。
O_EXCL 若是O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則創建該文件,不然將致使打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,而且欲打開的文件爲符號鏈接,則會打開文件失敗。
O_NOCTTY 若是欲打開的文件爲終端機設備時,則不會將該終端機當成進程控制終端機。
O_TRUNC 若文件存在而且以可寫的方式打開時,此旗標會令文件長度清爲0,而原來存於該文件的資料也會消失。
O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件後面。
O_NONBLOCK 以不可阻斷的方式打開文件,也就是不管有無數據讀取或等待,都會當即返回進程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打開文件。
O_NOFOLLOW 若是參數pathname 所指的文件爲一符號鏈接,則會令打開文件失敗。
O_DIRECTORY 若是參數pathname 所指的文件並不是爲一目錄,則會令打開文件失敗。
此爲Linux2.2之後特有的旗標,以免一些系統安全問題。參數mode 則有下列數種組合,只有在創建新文件時纔會生效,此外真正建文件時的權限會受到umask值所影響,所以該文件權限應該爲(mode-umaks)。
S_IRWXU00700 權限,表明該文件全部者具備可讀、可寫及可執行的權限。
S_IRUSR 或S_IREAD,00400權限,表明該文件全部者具備可讀取的權限。
S_IWUSR 或S_IWRITE,00200 權限,表明該文件全部者具備可寫入的權限。
S_IXUSR 或S_IEXEC,00100 權限,表明該文件全部者具備可執行的權限。
S_IRWXG 00070權限,表明該文件用戶組具備可讀、可寫及可執行的權限。
S_IRGRP 00040 權限,表明該文件用戶組具備可讀的權限。
S_IWGRP 00020權限,表明該文件用戶組具備可寫入的權限。
S_IXGRP 00010 權限,表明該文件用戶組具備可執行的權限。
S_IRWXO 00007權限,表明其餘用戶具備可讀、可寫及可執行的權限。
S_IROTH 00004 權限,表明其餘用戶具備可讀的權限
S_IWOTH 00002權限,表明其餘用戶具備可寫入的權限。
S_IXOTH 00001 權限,表明其餘用戶具備可執行的權限。
返回值
若全部欲覈查的權限都經過了檢查則返回0 值,表示成功,只要有一個權限被禁止則返回-1。
錯誤代碼
EEXIST 參數pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標。
EACCESS 參數pathname所指的文件不符合所要求測試的權限。
EROFS 欲測試寫入權限的文件存在於只讀文件系統內。
EFAULT 參數pathname指針超出可存取內存空間。
EINVAL 參數mode 不正確。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname不是目錄。
ENOMEM 核心內存不足。
ELOOP 參數pathname有過多符號鏈接問題。
EIO I/O 存取錯誤
三、close(關閉文件)
頭文件
1 #include
定義函數
1 int close(int fd);
函數說明
當使用完文件後若已再也不須要則可以使用close()關閉該文件,二close()會讓數據寫回磁盤,並釋放該文件所佔用的資源。參數fd爲先前由open()或creat()所返回的文件描述詞。
返回值
若文件順利關閉則返回0,發生錯誤時返回-1。
錯誤代碼
EBADF 參數fd 非有效的文件描述詞或該文件已關閉。
附加說明
雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行關閉文件,並確實檢查返回值。
四、read(由已打開的文件讀取數據)
頭文件
1 #include
定義函數
1 ssize_t read(int fd,void * buf ,size_t count);
函數說明
read()會把參數fd 所指的文件傳送count個字節到buf指針所指的內存中。若參數count爲0,則read()不會有做用並返回0。返回值爲實際讀取到的字節數,若是返回0,表示已到達文件尾或是無可讀取的數據,此外文件讀寫位置會隨讀取到的字節移動。
附加說明
如 果順利read()會返回實際讀到的字節數,最好能將返回值與參數count 做比較,若返回的字節數比要求讀取的字節數少,則有可能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()被信號中斷了讀取動做。當有錯 誤發生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則沒法預期。
錯誤代碼
EINTR 此調用被信號所中斷。
EAGAIN 當使用不可阻斷I/O 時(O_NONBLOCK),若無數據可讀取則返回此值。
EBADF 參數fd 非有效的文件描述詞,或該文件已關閉。
五、write(將數據寫入已打開的文件內)
頭文件
1 #include
定義函數
1 ssize_t write (int fd,const void * buf,size_t count);
函數說明
write()會把參數buf所指的內存寫入count個字節到參數fd所指的文件內。固然,文件讀寫位置也會隨之移動。
返回值
若是順利write()會返回實際寫入的字節數。當有錯誤發生時則返回-1,錯誤代碼存入errno中。
錯誤代碼
EINTR 此調用被信號所中斷。
EAGAIN 當使用不可阻斷I/O 時(O_NONBLOCK),若無數據可讀取則返回此值。
EADF 參數fd非有效的文件描述詞,或該文件已關閉。
六、flock(鎖定文件或解除鎖定)
頭文件
1 #include
定義函數
1 int flock(int fd,int operation);
函數說明
flock()會依參數operation所指定的方式對參數fd所指的文件作各類鎖定或解除鎖定的動做。此函數只能鎖定整個文件,沒法鎖定文件的某一區域。
參數
operation有下列四種狀況:
LOCK_SH 創建共享鎖定。多個進程可同時對同一個文件做共享鎖定。
LOCK_EX 創建互斥鎖定。一個文件同時只有一個互斥鎖定。
LOCK_UN 解除文件鎖定狀態。
LOCK_NB 沒法創建鎖定時,此操做可不被阻斷,立刻返回進程。一般與LOCK_SH或LOCK_EX 作OR(|)組合。
單一文件沒法同時創建共享鎖定和互斥鎖定,而當使用dup()或fork()時文件描述詞不會繼承此種鎖定。
返回值
返回0表示成功,如有錯誤則返回-1,錯誤代碼存於errno。
七、lseek(移動文件的讀寫位置)
頭文件
1 #include 2 #include
定義函數
1 off_t lseek(int fildes,off_t offset ,int whence);
函數說明
每個已打開的文件都有一個讀寫位 置,當打開文件時一般其讀寫位置是指向文件開頭,如果以附加的方式打開文件(如O_APPEND),則讀寫位置會指向文件尾。當read()或 write()時,讀寫位置會隨之增長,lseek()即是用來控制該文件的讀寫位置。參數fildes 爲已打開的文件描述詞,參數offset 爲根據參數whence來移動讀寫位置的位移數。
參數
whence爲下列其中一種:
SEEK_SET 參數offset即爲新的讀寫位置。
SEEK_CUR 以目前的讀寫位置日後增長offset個位移量。
SEEK_END 將讀寫位置指向文件尾後再增長offset個位移量。
當whence 值爲SEEK_CUR 或SEEK_END時,參數offet容許負值的出現。
下列是教特別的使用方式:
1) 欲將讀寫位置移到文件開頭時:lseek(int fildes,0,SEEK_SET);
2) 欲將讀寫位置移到文件尾時:lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置時:lseek(int fildes,0,SEEK_CUR);
返回值
當調用成功時則返回目前的讀寫位置,也就是距離文件開頭多少個字節。如有錯誤則返回-1,errno 會存放錯誤代碼。
附加說明
Linux系統不容許lseek()對tty裝置做用,此項動做會令lseek()返回ESPIPE。
八、fcntl(文件描述詞操做)
頭文件
1 #include 2 #include
定義函數
1 int fcntl(int fd , int cmd); 2 int fcntl(int fd,int cmd,long arg); 3 int fcntl(int fd,int cmd,struct flock * lock);
函數說明
fcntl()用來操做文件描述詞的一些特性。參數fd表明欲設置的文件描述詞,參數cmd表明欲操做的指令。
有如下幾種狀況:
F_DUPFD 用來查找大於或等於參數arg的最小且仍未使用的文件描述詞,而且複製參數fd的文件描述詞。執行成功則返回新複製的文件描述詞。請參考 dup2()。F_GETFD取得close-on-exec旗標。若此旗標的FD_CLOEXEC位爲0,表明在調用exec()相關函數時文件將不會 關閉。
F_SETFD 設置close-on-exec 旗標。該旗標以參數arg 的FD_CLOEXEC位決定。
F_GETFL 取得文件描述詞狀態旗標,此旗標爲open()的參數flags。
F_SETFL 設置文件描述詞狀態旗標,參數arg爲新旗標,但只容許O_APPEND、O_NONBLOCK和O_ASYNC位的改變,其餘位的改變將不受影響。
F_GETLK 取得文件鎖定的狀態。
F_SETLK 設置文件鎖定的狀態。此時flcok 結構的l_type 值必須是F_RDLCK、F_WRLCK或F_UNLCK。若是沒法創建鎖定,則返回-1,錯誤代碼爲EACCES 或EAGAIN。
F_SETLKW F_SETLK 做用相同,可是沒法創建鎖定時,此調用會一直等到鎖定動做成功爲止。若在等待鎖定的過程當中被信號中斷時,會當即返回-1,錯誤代碼爲EINTR。參數lock指針爲flock 結構指針,定義以下
複製代碼
1 struct flcok 2 { 3 short int l_type; /* 鎖定的狀態*/ 4 short int l_whence;/*決定l_start位置*/ 5 off_t l_start; /*鎖定區域的開頭位置*/ 6 off_t l_len; /*鎖定區域的大小*/ 7 pid_t l_pid; /*鎖定動做的進程*/ 8 };
複製代碼
l_type 有三種狀態:
F_RDLCK 創建一個供讀取用的鎖定
F_WRLCK 創建一個供寫入用的鎖定
F_UNLCK 刪除以前創建的鎖定
l_whence 也有三種方式:
SEEK_SET 以文件開頭爲鎖定的起始位置。
SEEK_CUR 以目前文件讀寫位置爲鎖定的起始位置
SEEK_END 以文件結尾爲鎖定的起始位置。
返回值
成功則返回0,如有錯誤則返回-1,錯誤緣由存於errno.
九、fgets(由文件中讀取一字符串)
頭文件
1 include
定義函數
1 char * fgets(char * s,int size,FILE * stream);
函數說明
fgets()用來從參數stream所指的文件內讀入字符並存到參數s所指的內存空間,直到出現換行字符、讀到文件尾或是已讀了size-1個字符爲止,最後會加上NULL做爲字符串結束。
返回值
gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
十、fputs(將一指定的字符串寫入文件內)
頭文件
1 #include
定義函數
1 int fputs(const char * s,FILE * stream);
函數說明
fputs()用來將參數s所指的字符串寫入到參數stream所指的文件內。
返回值
若成功則返回寫出的字符個數,返回EOF則表示有錯誤發生。
 
(二)內存控制篇
一、calloc(配置內存空間)
頭文件
1 #include
定義函數
1 void *calloc(size_t nmemb,size_t size);
函數說明
calloc()用來配置nmemb個相鄰的內存單位,每一單位的大小爲size,並返回指向第一個元素的指針。這和使用下列的方式效果相同:malloc(nmemb*size);不過,在利用calloc()配置內存時會將內存內容初始化爲0。
返回值
若配置成功則返回一指針,失敗則返回NULL。
二、free(釋放原先配置的內存)
頭文件
1 #include
定義函數
1 void free(void *ptr);
函數說明
參數ptr爲指向先前由 malloc()、calloc()或realloc()所返回的內存指針。調用free()後ptr所指的內存空間便會被收回。倘若參數ptr所指的內 存空間已被收回或是未知的內存地址,則調用free()可能會有沒法預期的狀況發生。若參數ptr爲NULL,則free()不會有任何做用。
三、malloc(配置內存空間)
頭文件
1 #include
定義函數
1 void * malloc(size_t size);
函數說明
malloc()用來配置內存空間,其大小由指定的size決定。
返回值
若配置成功則返回一指針,失敗則返回NULL。
範例
void p = malloc(1024); /*配置1k的內存*/

(三)進程操做篇
一、execl(執行文件)
頭文件
1 #include
定義函數
1 int execl(const char * path,const char * arg,....);
函數說明
execl()用來執行參數path字符串所表明的文件路徑,接下來的參數表明執行該文件時傳遞過去的argv(0)、argv[1]……,最後一個參數必須用空指針(NULL)做結束。
返回值
若是執行成功則函數不會返回,執行失敗則直接返回-1,失敗緣由存於errno中。
二、execlp(從PATH 環境變量中查找文件並執行)
頭文件
#include
定義函數
1 int execlp(const char * file,const char * arg,……);
函數說明
execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到後便執行該文件,而後將第二個之後的參數當作該文件的argv[0]、argv[1]……,最後一個參數必須用空指針(NULL)做結束。
返回值
若是執行成功則函數不會返回,執行失敗則直接返回-1,失敗緣由存於errno 中。
錯誤代碼
參考execve()。
三、execv(執行文件)
頭文件
1 #include
定義函數
1 int execv (const char * path, char * const argv[ ]);
函數說明
execv()用來執行參數path字符串所表明的文件路徑,與execl()不一樣的地方在於execve()只需兩個參數,第二個參數利用數組指針來傳遞給執行文件。
返回值
若是執行成功則函數不會返回,執行失敗則直接返回-1,失敗緣由存於errno 中。
錯誤代碼
請參考execve()。
四、execve(執行文件)
頭文件
1 #include
定義函數
1 int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函數說明
execve()用來執行參數filename字符串所表明的文件路徑,第二個參數系利用數組指針來傳遞給執行文件,最後一個參數則爲傳遞給執行文件的新環境變量數組。
返回值
若是執行成功則函數不會返回,執行失敗則直接返回-1,失敗緣由存於errno 中。
錯誤代碼
EACCES
1. 欲執行的文件不具備用戶可執行的權限。
2. 欲執行的文件所屬的文件系統是以noexec 方式掛上。
3.欲執行的文件或script翻譯器非通常文件。
EPERM
1.進程處於被追蹤模式,執行者並不具備root權限,欲執行的文件具備SUID 或SGID 位。
2.欲執行的文件所屬的文件系統是以nosuid方式掛上,欲執行的文件具備SUID 或SGID 位元,但執行者並不具備root權限。
E2BIG 參數數組過大
ENOEXEC 沒法判斷欲執行文件的執行文件格式,有多是格式錯誤或沒法在此平臺執行。
EFAULT 參數filename所指的字符串地址超出可存取空間範圍。
ENAMETOOLONG 參數filename所指的字符串太長。
ENOENT 參數filename字符串所指定的文件不存在。
ENOMEM 核心內存不足
ENOTDIR 參數filename字符串所包含的目錄路徑並不是有效目錄
EACCES 參數filename字符串所包含的目錄路徑沒法存取,權限不足
ELOOP 過多的符號鏈接
ETXTBUSY 欲執行的文件已被其餘進程打開並且正把數據寫入該文件中
EIO I/O 存取錯誤
ENFILE 已達到系統所容許的打開文件總數。
EMFILE 已達到系統所容許單一進程所能打開的文件總數。
EINVAL 欲執行文件的ELF執行格式不僅一個PT_INTERP節區
EISDIR ELF翻譯器爲一目錄
ELIBBAD ELF翻譯器有問題。
五、execvp(執行文件)
頭文件
1 #include
定義函數
1 int execvp(const char *file ,char * const argv []);
函數說明
execvp()會從PATH 環境變量所指的目錄中查找符合參數file 的文件名,找到後便執行該文件,而後將第二個參數argv傳給該欲執行的文件。
返回值
若是執行成功則函數不會返回,執行失敗則直接返回-1,失敗緣由存於errno中。
錯誤代碼
請參考execve()。
六、exit(正常結束進程)
頭文件
1 #include
定義函數
1 void exit(int status);
函數說明
exit()用來正常終結目前進程的執行,並把參數status返回給父進程,而進程全部的緩衝區數據會自動寫回並關閉未關閉的文件。
七、_exit(結束進程執行)
頭文件
1 #include
定義函數
1 void _exit(int status);
函數說明
_exit()用來馬上結束目前進程的執行,並把參數status返回給父進程,並關閉未關閉的文件。此函數調用後不會返回,而且會傳遞SIGCHLD信號給父進程,父進程能夠由wait函數取得子進程結束狀態。
附加說明
_exit()不會處理標準I/O 緩衝區,如要更新緩衝區請使用exit()。

八、vfork(創建一個新的進程)
頭文件
1 #include
定義函數
1 pid_t vfork(void);
函數說明
vfork()會產生一個新的子進 程,其子進程會複製父進程的數據與堆棧空間,並繼承父進程的用戶代碼,組代碼,環境變量、已打開的文件代碼、工做目錄和資源限制等。Linux 使用copy-on-write(COW)技術,只有當其中一進程試圖修改欲複製的空間時纔會作真正的複製動做,因爲這些繼承的信息是複製而來,並不是指相 同的內存空間,所以子進程對這些變量的修改和父進程並不會同步。此外,子進程不會繼承父進程的文件鎖定和未處理的信號。注意,Linux不保證子進程會比 父進程先執行或晚執行,所以編寫程序時要留意
死鎖或競爭條件的發生。
返回值
若是vfork()成功則在父進程會返回新創建的子進程代碼(PID),而在新創建的子進程中則返回0。若是vfork 失敗則直接返回-1,失敗緣由存於errno中。
錯誤代碼
EAGAIN 內存不足。ENOMEM 內存不足,沒法配置核心所需的數據結構空間。
九、getpid(取得進程識別碼)
頭文件
1 #include
定義函數
1 pid_t getpid(void);
函數說明
getpid()用來取得目前進程的進程識別碼,許多程序利用取到的此值來創建臨時文件,以免臨時文件相同帶來的問題。
返回值
目前進程的進程識別碼
十、getppid(取得父進程的進程識別碼)
頭文件
1 #include
定義函數
1 pid_t getppid(void);
函數說明
getppid()用來取得目前進程的父進程識別碼。
返回值
目前進程的父進程識別碼。
十一、wait(等待子進程中斷或結束)
頭文件
1 #include 2 #include
定義函數
1 pid_t wait (int * status);
函數說明
wait()會暫時中止目前進程的執行,直到有信號來到或子進程結束。若是在調用wait()時子進程已經結束,則wait()會當即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。若是不在乎結束狀態值,則
參數
status能夠設成NULL。子進程的結束狀態值請參考waitpid()。
返回值
若是執行成功則返回子進程識別碼(PID),若是有錯誤發生則返回-1。失敗緣由存於errno中。
十二、waitpid(等待子進程中斷或結束)
頭文件
1 #include 2 #include
定義函數
1 pid_t waitpid(pid_t pid,int * status,int options);
函數說明
waitpid()會暫時中止目前 進程的執行,直到有信號來到或子進程結束。若是在調用wait()時子進程已經結束,則wait()會當即返回子進程結束狀態值。子進程的結束狀態值會由 參數status返回,而子進程的進程識別碼也會一快返回。若是不在乎結束狀態值,則參數status能夠設成 NULL。參數pid爲欲等待的子進程識別碼,其餘數值意義以下:
pid<-1 等待進程組識別碼爲pid絕對值的任何子進程。
pid=-1 等待任何子進程,至關於wait()。
pid=0 等待進程組識別碼與目前進程相同的任何子進程。
pid>0 等待任何子進程識別碼爲pid的子進程。
參數option能夠爲0 或下面的OR 組合
WNOHANG 若是沒有任何已經結束的子進程則立刻返回,不予以等待。
WUNTRACED 若是子進程進入暫停執行狀況則立刻返回,但結束狀態不予以理會。
子進程的結束狀態返回後存於status,底下有幾個宏可判別結束狀況
WIFEXITED(status)若是子進程正常結束則爲非0值。
WEXITSTATUS(status)取得子進程exit()返回的結束代碼,通常會先用WIFEXITED 來判斷是否正常結束才能使用此宏。
WIFSIGNALED(status)若是子進程是由於信號而結束則此宏值爲真
WTERMSIG(status)取得子進程因信號而停止的信號代碼,通常會先用WIFSIGNALED 來判斷後才使用此宏。
WIFSTOPPED(status)若是子進程處於暫停執行狀況則此宏值爲真。通常只有使用WUNTRACED 時纔會有此狀況。
WSTOPSIG(status)取得引起子進程暫停的信號代碼,通常會先用WIFSTOPPED 來判斷後才使用此宏。
返回值
若是執行成功則返回子進程識別碼(PID),若是有錯誤發生則返回-1。失敗緣由存於errno中。
 
(四)信號處理篇
一、sigaction(查詢或設置信號處理方式)
頭文件
1 #include
定義函數
1 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
函數說明
sigaction()會依參數signum指定的信號編號來設置該信號的處理函數。參數signum能夠指定SIGKILL和SIGSTOP之外的全部信號。
如參數結構sigaction定義以下
複製代碼
1 struct sigaction 2 { 3 void (*sa_handler) (int); 4  sigset_t sa_mask; 5 int sa_flags; 6 void (*sa_restorer) (void); 7 }
複製代碼
sa_handler此參數和signal()的參數handler相同,表明新的信號處理函數,其餘意義請參考signal()。
sa_mask 用來設置在處理該信號時暫時將sa_mask 指定的信號擱置。
sa_restorer 此參數沒有使用。
sa_flags 用來設置信號處理的其餘相關操做,下列的數值可用。
OR 運算(|)組合
A_NOCLDSTOP : 若是參數signum爲SIGCHLD,則當子進程暫停時並不會通知父進程
SA_ONESHOT/SA_RESETHAND:當調用新的信號處理函數前,將此信號處理方式改成系統預設的方式。
SA_RESTART:被信號中斷的系統調用會自行重啓
SA_NOMASK/SA_NODEFER:在處理此信號未結束前不理會此信號的再次到來。
若是參數oldact不是NULL指針,則原來的信號處理方式會由此結構sigaction 返回。
返回值
執行成功則返回0,若是有錯誤則返回-1。
錯誤代碼
EINVAL 參數signum 不合法, 或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號
EFAULT 參數act,oldact指針地址沒法存取。
EINTR 此調用被中斷
二、sigaddset(增長一個信號至信號集)
頭文件
1 #include
定義函數
1 int sigaddset(sigset_t *set,int signum);
函數說明
sigaddset()用來將參數signum 表明的信號加入至參數set 信號集裏。
返回值
執行成功則返回0,若是有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址沒法存取
EINVAL 參數signum非合法的信號編號
三、sigdelset(從信號集裏刪除一個信號)
頭文件
1 #include
定義函數
1 int sigdelset(sigset_t * set,int signum);
函數說明
sigdelset()用來將參數signum表明的信號從參數set信號集裏刪除。
返回值
執行成功則返回0,若是有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址沒法存取
EINVAL 參數signum非合法的信號編號
四、sigemptyset(初始化信號集)
頭文件
1 #include
定義函數
1 int sigemptyset(sigset_t *set);
函數說明
sigemptyset()用來將參數set信號集初始化並清空。
返回值
執行成功則返回0,若是有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址沒法存取
五、sigfillset(將全部信號加入至信號集)
頭文件
1 #include
定義函數
1 int sigfillset(sigset_t * set);
函數說明
sigfillset()用來將參數set信號集初始化,而後把全部的信號加入到此信號集裏。
返回值
執行成功則返回0,若是有錯誤則返回-1。
附加說明
EFAULT 參數set指針地址沒法存取
六、sigismember(測試某個信號是否已加入至信號集裏)
頭文件
1 #include
定義函數
1 int sigismember(const sigset_t *set,int signum);
函數說明
sigismember()用來測試參數signum 表明的信號是否已加入至參數set信號集裏。若是信號集裏已有該信號則返回1,不然返回0。
返回值
信號集已有該信號則返回1,沒有則返回0。若是有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址沒法存取
EINVAL 參數signum 非合法的信號編號
七、signal(設置信號處理方式)
頭文件
1 #include
定義函數
1 void (*signal(int signum,void(* handler)(int)))(int);
函數說明
signal()會依參數signum 指定的信號編號來設置該信號的處理函數。當指定的信號到達時就會跳轉到參數handler指定的函數執行。若是
參數handler不是函數指針,則必須是下列兩個常數之一:
SIG_IGN 忽略參數signum指定的信號。
SIG_DFL 將參數signum 指定的信號重設爲核心預設的信號處理方式。
關於信號的編號和說明,請參考附錄D
返回值
返回先前的信號處理函數指針,若是有錯誤則返回SIG_ERR(-1)。
附加說明
在信號發生跳轉到自定的handler處理函數執行後,系統會自動將此處理函數換回原來系統預設的處理方式,若是要改變此操做請改用
sigaction()。
八、sleep(讓進程暫停執行一段時間)
頭文件
1 #include
定義函數
1 unsigned int sleep(unsigned int seconds);
函數說明
sleep()會令目前的進程暫停,直到達到參數seconds 所指定的時間,或是被信號所中斷。
返回值
若進程暫停到參數seconds 所指定的時間則返回0,如有信號中斷則返回剩餘秒數。
九、perror(打印出錯誤緣由信息字符串)
頭文件
1 #include
定義函數
1 void perror(const char *s);
函數說明
perror()用來將上一個函數發生錯誤的緣由輸出到標準錯誤(stderr)。參數s所指的字符串會先打印出,後面再加上錯誤緣由字符串。此
錯誤緣由依照全局變量errno的值來決定要輸出的字符串。
返回值
十、mkfifo(創建具名管道)
頭文件
1 #include 2 #include
定義函數
1 int mkfifo(const char * pathname,mode_t mode);
函數說明
mkfifo()會依參數pathname創建特殊的FIFO文件,該文件必須不存在,而參數mode爲該文件的權限(mode%~umask),所以 umask值也會
影響到FIFO文件的權限。Mkfifo()創建的FIFO文件其餘進程均可以用讀寫通常文件的方式存取。當使用open()來打開 FIFO文件時,
O_NONBLOCK旗標會有影響
一、當使用O_NONBLOCK 旗標時,打開FIFO 文件來讀取的操做會馬上返回,可是若尚未其餘進程打開FIFO 文件來讀取,則寫入的操做會
返回ENXIO 錯誤代碼。
二、沒有使用O_NONBLOCK 旗標時,打開FIFO 來讀取的操做會等到其餘進程打開FIFO文件來寫入才正常返回。一樣地,打開FIFO文件來寫
入的操做會等到其餘進程打開FIFO 文件來讀取後才正常返回。
返回值
若成功則返回0,不然返回-1,錯誤緣由存於errno中。
錯誤代碼
EACCESS 參數pathname所指定的目錄路徑無可執行的權限
EEXIST 參數pathname所指定的文件已存在。
ENAMETOOLONG 參數pathname的路徑名稱太長。
ENOENT 參數pathname包含的目錄不存在
ENOSPC 文件系統的剩餘空間不足
ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。
EROFS 參數pathname指定的文件存在於只讀文件系統內。
十一、pclose(關閉管道I/O)
頭文件
1 #include
定義函數
1 int pclose(FILE * stream);
函數說明
pclose()用來關閉由popen所創建的管道及文件指針。參數stream爲先前由popen()所返回的文件指針。
返回值
返回子進程的結束狀態。若是有錯誤則返回-1,錯誤緣由存於errno中。
錯誤代碼
ECHILD pclose()沒法取得子進程的結束狀態。
十二、pipe(創建管道)
頭文件
1 #include
定義函數
1 int pipe(int filedes[2]);
函數說明
pipe()會創建管道,並將文件描述詞由參數filedes數組返回。filedes[0]爲管道里的讀取端,filedes[1]則爲管道的寫入端。
返回值
若成功則返回零,不然返回-1,錯誤緣由存於errno中。
錯誤代碼
EMFILE 進程已用完文件描述詞最大量。
ENFILE 系統已無文件描述詞可用。
EFAULT 參數filedes數組地址不合法。
1三、popen(創建管道I/O)
頭文件
1 #include
定義函數
1 FILE * popen( const char * command,const char * type);
函數說明
popen()會調用fork()產生子進程,而後從子進程中調用/bin/sh -c來執行參數command的指令。參數type可以使用「r」表明讀取,「w」代
表寫入。依照此type值,popen()會創建管道連到子進程的標準輸出設備或標準輸入設備,而後返回一個文件指針。隨後進程即可利用此
文件指針來讀取子進程的輸出設備或是寫入到子進程的標準輸入設備中。此外,全部使用文件指針(FILE*)操做的函數也均可以使用,除
了fclose()之外。
返回值
若成功則返回文件指針,不然返回NULL,錯誤緣由存於errno中。
錯誤代碼
EINVAL參數type不合法。
注意事項
在編寫具SUID/SGID權限的程序時請儘可能避免使用popen(),popen()會繼承環境變量,經過環境變量可能會形成系統安全的問題。
 
(五)接口處理篇
一、accept(接受socket連線)
頭文件
1 #include 2 #include
定義函數
1 int accept(int s,struct sockaddr * addr,int * addrlen);
函數說明
accept()用來接受參數s的socket連線。參數s的socket必需先經bind()、listen()函數處理過,當有連線進來時 accept()會返回一個新的
socket處理代碼,日後的數據傳送與讀取就是經由新的socket處理,而原來參數s的socket能繼續使用 accept()來接受新的連線要求。連
線成功時,參數addr所指的結構會被系統填入遠程主機的地址數據,參數addrlen爲scokaddr的結構長度。關於結構sockaddr的定義請參
考bind()。
返回值
成功則返回新的socket處理代碼,失敗返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數s 非合法socket處理代碼。
EFAULT 參數addr指針指向沒法存取的內存空間。
ENOTSOCK 參數s爲一文件描述詞,非socket。
EOPNOTSUPP 指定的socket並不是SOCK_STREAM。
EPERM 防火牆拒絕此連線。
ENOBUFS 系統的緩衝內存不足。
ENOMEM 核心內存不足。
二、bind(對socket定位)
頭文件
1 #include 2 #include
定義函數
1 int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
函數說明
bind()用來設置給參數sockfd的socket一個名稱。此名稱由參數my_addr指向一sockaddr結構,對於不一樣的socket domain定義了一個通
用的數據結構
1 struct sockaddr 2 { 3 unsigned short int sa_family; 4 char sa_data[14]; 5 };
sa_family 爲調用socket()時的domain參數,即AF_xxxx值。
sa_data 最多使用14個字符長度。
此sockaddr結構會因使用不一樣的socket domain而有不一樣結構定義,例如使用AF_INET domain,其socketaddr結構定義便爲
複製代碼
1 struct socketaddr_in  2 {  3 unsigned short int sin_family;  4  uint16_t sin_port;  5 struct in_addr sin_addr;  6 unsigned char sin_zero[8];  7 };  8 struct in_addr  9 { 10  uint32_t s_addr; 11 };
複製代碼
sin_family 即爲sa_family
sin_port 爲使用的port編號
sin_addr.s_addr 爲IP 地址
sin_zero 未使用。
參數
addrlen爲sockaddr的結構長度。
返回值
成功則返回0,失敗返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數sockfd 非合法socket處理代碼。
EACCESS 權限不足
ENOTSOCK 參數sockfd爲一文件描述詞,非socket。
三、connect(創建socket連線)
頭文件
1 #include 2 #include
定義函數
1 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函數說明
connect()用來將參數sockfd 的socket 連至參數serv_addr 指定的網絡地址。結構sockaddr請參考bind()。參數addrlen爲sockaddr的結
構長度。
返回值
成功則返回0,失敗返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數sockfd 非合法socket處理代碼
EFAULT 參數serv_addr指針指向沒法存取的內存空間
ENOTSOCK 參數sockfd爲一文件描述詞,非socket。
EISCONN 參數sockfd的socket已經是連線狀態
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操做超過限定時間仍未有響應。
ENETUNREACH 沒法傳送數據包至指定的主機。
EAFNOSUPPORT sockaddr結構的sa_family不正確。
EALREADY socket爲不可阻斷且先前的連線操做還未完成。
四、htonl(將32位主機字符順序轉換成網絡字符順序)
頭文件
1 #includein.h>
定義函數
1 unsigned long int htonl(unsigned long int hostlong);
函數說明
htonl()用來將參數指定的32位hostlong 轉換成網絡字符順序。
返回值
返回對應的網絡字符順序。
五、htons(將16位主機字符順序轉換成網絡字符順序)
頭文件
1 #includein.h>
定義函數
1 unsigned short int htons(unsigned short int hostshort);
函數說明
htons()用來將參數指定的16位hostshort轉換成網絡字符順序。
返回值
返回對應的網絡字符順序。
六、inet_addr(將網絡地址轉成二進制的數字)
頭文件
1 #include 2 #includein.h> 3 #include
定義函數
1 unsigned long int inet_addr(const char *cp);
函數說明
inet_addr()用來將參數cp所指的網絡地址字符串轉換成網絡所使用的二進制數字。網絡地址字符串是以數字和點組成的字符串,例
如:「163.13.132.68」。
返回值
成功則返回對應的網絡二進制的數字,失敗返回-1。
七、inet_aton(將網絡地址轉成網絡二進制的數字)
頭文件
1 #include 2 #includein.h> 3 #include
定義函數
1 int inet_aton(const char * cp,struct in_addr *inp);
函數說明
inet_aton()用來將參數cp所指的網絡地址字符串轉換成網絡使用的二進制的數字,而後存於參數inp所指的in_addr結構中。
結構in_addr定義以下
struct in_addr
{
   unsigned long int s_addr;
};
返回值
成功則返回非0值,失敗則返回0。

八、inet_ntoa(將網絡二進制的數字轉換成網絡地址)
頭文件
1 #include 2 #includein.h> 3 #include
定義函數
1 char * inet_ntoa(struct in_addr in);
函數說明
inet_ntoa()用來將參數in所指的網絡二進制的數字轉換成網絡地址,而後將指向此網絡地址字符串的指針返回。
返回值
成功則返回字符串指針,失敗則返回NULL。
九、listen(等待鏈接)
頭文件
1 #include
定義函數
1 int listen(int s,int backlog);
函數說明
listen()用來等待參數s 的socket連線。參數backlog指定同時能處理的最大鏈接要求,若是鏈接數目達此上限則client端將收到
ECONNREFUSED的錯誤。 Listen()並未開始接收連線,只是設置socket爲listen模式,真正接收client端連線的是accept()。一般listen()
會在socket(),bind()以後調用,接着才調用accept()。
返回值
成功則返回0,失敗返回-1,錯誤緣由存於errno
附加說明
listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。若是socket爲AF_INET則參數backlog 最大值可設至128。
錯誤代碼
EBADF 參數sockfd非合法socket處理代碼
EACCESS 權限不足
EOPNOTSUPP 指定的socket並未支援listen模式。
十、ntohl(將32位網絡字符順序轉換成主機字符順序)
頭文件
1 #includein.h>
定義函數
1 unsigned long int ntohl(unsigned long int netlong);
函數說明
ntohl()用來將參數指定的32位netlong轉換成主機字符順序。
返回值
返回對應的主機字符順序。
十一、ntohs(將16位網絡字符順序轉換成主機字符順序)
頭文件
1 #includein.h>
定義函數
1 unsigned short int ntohs(unsigned short int netshort);
函數說明
ntohs()用來將參數指定的16位netshort轉換成主機字符順序。
返回值
返回對應的主機順序。
十二、recv(經socket接收數據)
頭文件
1 #include 2 #include
定義函數
1 int recv(int s,void *buf,int len,unsigned int flags);
函數說明
recv()用來接收遠端主機經指定的socket傳來的數據,並把數據存到由參數buf 指向的內存空間,參數len爲可接收數據的最大長度。
參數
flags通常設0。其餘數值定義以下:
MSG_OOB 接收以out-of-band 送出的數據。
MSG_PEEK 返回來的數據並不會在系統內刪除,若是再調用recv()會返回相同的數據內容。
MSG_WAITALL強迫接收到len大小的數據後才能返回,除非有錯誤或信號產生。
MSG_NOSIGNAL此操做不肯被SIGPIPE信號中斷返回值成功則返回接收到的字符數,失敗返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數s非合法的socket處理代碼
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷
EAGAIN 此動做會令進程阻斷,但參數s的socket爲不可阻斷
ENOBUFS 系統的緩衝內存不足。
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。
1三、recvfrom(經socket接收數據)
相關函數
recv,recvmsg,send,sendto,socket
頭文件
1 #include 2 #include
定義函數
1 int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
函數說明
recv()用來接收遠程主機經指定的socket 傳來的數據,並把數據存到由參數buf 指向的內存空間,參數len 爲可接收數據的最大長度。參
數flags 通常設0,其餘數值定義請參考recv()。參數from用來指定欲傳送的網絡地址,結構sockaddr 請參考bind()。參數fromlen爲
sockaddr的結構長度。
返回值
成功則返回接收到的字符數,失敗則返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數s非合法的socket處理代碼
EFAULT 參數中有一指針指向沒法存取的內存空間。
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。
1四、recvmsg(經socket接收數據)
頭文件
1 #include 2 #include
定義函數
1 int recvmsg(int s,struct msghdr *msg,unsigned int flags);
函數說明
recvmsg()用來接收遠程主機經指定的socket傳來的數據。參數s爲已創建好連線的socket,若是利用UDP協議則不需通過連線操做。參
數 msg指向欲連線的數據結構內容,參數flags通常設0,詳細描述請參考send()。關於結構msghdr的定義請參考sendmsg()。
返回值
成功則返回接收到的字符數,失敗則返回-1,錯誤緣由存於errno中。
錯誤代碼
EBADF 參數s非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。
1五、send(經socket傳送數據)
頭文件
1 #include 2 #include
定義函數
1 int send(int s,const void * msg,int len,unsigned int falgs);
函數說明
send()用來將數據由指定的socket 傳給對方主機。參數s爲已創建好鏈接的socket。參數msg指向欲連線的數據內容,參數len則爲數據長
度。參數flags通常設0,其餘數值定義以下
MSG_OOB 傳送的數據以out-of-band 送出。
MSG_DONTROUTE 取消路由表查詢
MSG_DONTWAIT 設置爲不可阻斷運做
MSG_NOSIGNAL 此動做不肯被SIGPIPE 信號中斷。
返回值
成功則返回實際傳送出去的字符數,失敗返回-1。錯誤緣由存於errno
錯誤代碼
EBADF 參數s 非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。
1六、sendmsg(經socket傳送數據)
頭文件
1 #include 2 #include
定義函數
1 int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
函數說明
sendmsg()用來將數據由指定的socket傳給對方主機。參數s爲已創建好連線的socket,若是利用UDP協議則不需通過連線操做。參數msg
指向欲連線的數據結構內容,參數flags通常默認爲0,詳細描述請參考send()。
結構msghdr定義以下
複製代碼
1 struct msghdr  2 {  3 void *msg_name; /*Address to send to /receive from . */  4 socklen_t msg_namelen; /* Length of addres data */  5 strcut iovec * msg_iov; /* Vector of data to send/receive into */  6 size_t msg_iovlen; /* Number of elements in the vector */  7 void * msg_control; /* Ancillary dat */  8 size_t msg_controllen; /* Ancillary data buffer length */  9 int msg_flags; /* Flags on received message */ 10 };
複製代碼
返回值
成功則返回實際傳送出去的字符數,失敗返回-1,錯誤緣由存於errno
錯誤代碼
EBADF 參數s 非合法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間
ENOTSOCK 參數s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此操做會令進程阻斷,但參數s的socket爲不可阻斷。
ENOBUFS 系統的緩衝內存不足
ENOMEM 核心內存不足
EINVAL 傳給系統調用的參數不正確。
1七、sendto(經socket傳送數據)
頭文件
1 #include < sys/types.h > 2 #include < sys/socket.h >
定義函數
1 int sendto ( int s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
函數說明
sendto() 用來將數據由指定的socket傳給對方主機。參數s爲已建好連線的socket,若是利用UDP協議則不需通過連線操做。參數msg指向
欲連線的數據內容,參數flags 通常設0,詳細描述請參考send()。參數to用來指定欲傳送的網絡地址,結構sockaddr請參考bind()。參數
tolen爲sockaddr的結果長度。
返回值
成功則返回實際傳送出去的字符數,失敗返回-1,錯誤緣由存於errno 中。
錯誤代碼
EBADF 參數s非法的socket處理代碼。
EFAULT 參數中有一指針指向沒法存取的內存空間。
WNOTSOCK canshu s爲一文件描述詞,非socket。
EINTR 被信號所中斷。
EAGAIN 此動做會令進程阻斷,但參數s的soket爲補課阻斷的。
ENOBUFS 系統的緩衝內存不足。
EINVAL 傳給系統調用的參數不正確。
1八、socket(創建一個socket通訊)
頭文件
1 #include 2 #include
定義函數
1 int socket(int domain,int type,int protocol);
函數說明
socket()用來創建一個新的socket,也就是向系統註冊,通知系統創建一通訊端口。參數domain 指定使用何種的地址類型,完整的定義
在/usr/include/bits/socket.h 內,底下是常見的協議:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 進程通訊協議
PF_INET?AF_INET Ipv4網絡協議
PF_INET6/AF_INET6 Ipv6 網絡協議
PF_IPX/AF_IPX IPX-Novell協議
PF_NETLINK/AF_NETLINK 核心用戶接口裝置
PF_X25/AF_X25 ITU-T X.25/ISO-8208 協議
PF_AX25/AF_AX25 業餘無線AX.25協議
PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)協議
PF_PACKET/AF_PACKET 初級封包接口
參數
type有下列幾種數值:
SOCK_STREAM 提供雙向連續且可信賴的數據流,即TCP。支持
OOB 機制,在全部數據傳送前必須使用connect()來創建連線狀態。
SOCK_DGRAM 使用不連續不可信賴的數據包鏈接
SOCK_SEQPACKET 提供連續可信賴的數據包鏈接
SOCK_RAW 提供原始網絡協議存取
SOCK_RDM 提供可信賴的數據包鏈接
SOCK_PACKET 提供和網絡驅動程序直接通訊。
protocol用來指定socket所使用的傳輸協議編號,一般此參考不用管它,設爲0便可。
返回值
成功則返回socket處理代碼,失敗返回-1。
錯誤代碼
EPROTONOSUPPORT 參數domain指定的類型不支持參數type或protocol指定的協議
ENFILE 核心內存不足,沒法創建新的socket結構
EMFILE 進程文件表溢出,沒法再創建新的socket
EACCESS 權限不足,沒法創建type或protocol指定的協議
ENOBUFS/ENOMEM 內存不足
EINVAL 參數domain/type/protocol不合法

(六)環境變量篇
一、getenv(取得環境變量內容)
頭文件
1 #include
定義函數
1 char * getenv(const char *name);
函數說明
getenv()用來取得參數name環境變量的內容。參數name爲環境變量的名稱,若是該變量存在則會返回指向該內容的指針。環境變量的格
式爲name=value。
返回值
執行成功則返回指向該內容的指針,找不到符合的環境變量名稱則返回NULL。
二、putenv(改變或增長環境變量)
頭文件
1 #include
定義函數
1 int putenv(const char * string);
函數說明
putenv()用來改變或增長環境變量的內容。參數string的格式爲name=value,若是該環境變量原先存在,則變量內容會依參數string改
變,不然此參數內容會成爲新的環境變量。
返回值
執行成功則返回0,有錯誤發生則返回-1。
錯誤代碼
ENOMEM 內存不足,沒法配置新的環境變量空間。
三、setenv(改變或增長環境變量)
頭文件
1 #include
定義函數
1 int setenv(const char *name,const char * value,int overwrite);
函數說明
setenv()用來改變或增長環境變量的內容。參數name爲環境變量名稱字符串。
參數
value則爲變量內容,參數overwrite用來決定是否要改變已存在的環境變量。若是overwrite不爲0,而該環境變量原已有內容,則原內
容會被改成參數value所指的變量內容。若是overwrite爲0,且該環境變量已有內容,則參數value會被忽略。
返回值
執行成功則返回0,有錯誤發生時返回-1。
錯誤代碼
ENOMEM 內存不足,沒法配置新的環境變量空間

(七)內存及字符串操做篇
一、bcmp(比較內存內容)
頭文件
1 #include<string.h>
定義函數
1 int bcmp ( const void *s1,const void * s2,int n);
函數說明
bcmp()用來比較s1和s2所指的內存區間前n個字節,若參數n爲0,則返回0。
返回值
若參數s1 和s2 所指的內存內容都徹底相同則返回0 值,不然返回非零值。
二、bcopy(拷貝內存內容)
頭文件
1 #include <string.h>
定義函數
1 void bcopy ( const void *src,void *dest ,int n);
函數說明
bcopy()與memcpy()同樣都是用來拷貝src所指的內存內容前n個字節到dest所指的地址,不過參數src與dest在傳給函數時是相反的位置。
返回值
三、bzero(將一段內存內容全清爲零)
頭文件
1 #include<string.h>
定義函數
1 void bzero(void *s,int n);
函數說明
bzero()會將參數s所指的內存區域前n個字節,所有設爲零值。至關於調用memset((void*)s,0,size_tn);
四、memccpy(拷貝內存內容)
頭文件
1 #include<string.h>
定義函數
1 void * memccpy(void *dest, const void * src, int c,size_t n);
函數說明
memccpy()用來拷貝src所指的內存內容前n個字節到dest所指的地址上。與memcpy()不一樣的是,memccpy()會在複製時檢查參數c是否出
現,如果則返回dest中值爲c的下一個字節地址。
返回值
返回指向dest中值爲c的下一個字節指針。返回值爲0表示在src所指內存前n個字節中沒有值爲c的字節。
五、memcmp(比較內存內容)
頭文件
1 #include<string.h>
定義函數
1 int memcmp (const void *s1,const void *s2,size_t n);
函數說明
memcmp()用來比較s1和s2所指的內存區間前n個字符。字符串大小的比較是以ASCII碼錶上的順序來決定,次順序亦爲字符的值。memcmp ()
首先將s1第一個字符值減去s2第一個字符的值,若差爲0則再繼續比較下個字符,若差值不爲0則將差值返回。例如,字符串"Ac"和"ba"比
較則會返回字符'A'(65)和'b'(98)的差值(-33)。
返回值
若參數s1和s2所指的內存內容都徹底相同則返回0值。s1若大於s2則返回大於0的值。s1若小於s2則返回小於0的值。
六、memcpy(拷貝內存內容)
頭文件
1 #include<string.h>
定義函數
1 void * memcpy (void * dest ,const void *src, size_t n);
函數說明
memcpy()用來拷貝src所指的內存內容前n個字節到dest所指的內存地址上。與strcpy()不一樣的是,memcpy()會完整的複製n個字節,不會因
爲遇到字符串結束'\0'而結束。
返回值
返回指向dest的指針。
附加說明
指針src和dest所指的內存區域不可重疊。
七、memset(將一段內存空間填入某值)
頭文件
1 #include<string.h>
定義函數
1 void * memset (void *s ,int c, size_t n);
函數說明
memset()會將參數s所指的內存區域前n個字節以參數c填入,而後返回指向s的指針。在編寫程序時,若須要將某一數組做初始化
memset()會至關方便。
返回值
返回指向s的指針。
附加說明
參數c雖聲明爲int, 但必須是unsigned char ,因此範圍在0到255之間。
八、strlen(返回字符串長度)
頭文件
1 #include<string.h>
定義函數
1 size_t strlen (const char *s);
函數說明
strlen()用來計算指定的字符串s的長度,不包括結束字符"\0"。
返回值
返回字符串s的字符數。

數組

相關文章
相關標籤/搜索