Linux API函數總結


(一)文件操作篇

 1、creat(建立文件)

頭文件

1 #include<sys/types.h>
2 #include<sys/stat.h>
3 #include<fcntl.h>

定義函數

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()。

2、open(打開文件)
頭文件

1 #include<sys/types.h>
2 #include<sys/stat.h>
3 #include<fcntl.h>

定義函數

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 存取錯誤

 3、close(關閉文件)

頭文件

1 #include<unistd.h>

 定義函數 

1 int close(int fd);

 函數說明

當使用完文件后若已不再需要則可使用close()關閉該文件,二close()會讓數據寫回磁盤,並釋放該文件所占用的資源。參數fd為先前由open()或creat()所返回的文件描述詞。
返回值
若文件順利關閉則返回0,發生錯誤時返回-1。
錯誤代碼
EBADF 參數fd 非有效的文件描述詞或該文件已關閉。
附加說明
雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行關閉文件,並確實檢查返回值。

 4、read(由已打開的文件讀取數據)

頭文件

1 #include<unistd.h>

 定義函數 

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 非有效的文件描述詞,或該文件已關閉。

 5、write(將數據寫入已打開的文件內)

頭文件

1 #include<unistd.h>

 定義函數 

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非有效的文件描述詞,或該文件已關閉。

 6、flock(鎖定文件或解除鎖定)

頭文件

1 #include<sys/file.h>

 定義函數 

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。

 7、lseek(移動文件的讀寫位置)

頭文件

1 #include<sys/types.h>
2 #include<unistd.h>

 定義函數 

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。

 8、fcntl(文件描述詞操作)

頭文件

1 #include<unistd.h>
2 #include<fcntl.h>

 定義函數 

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.

 9、fgets(由文件中讀取一字符串)

頭文件

1 include<stdio.h>

 定義函數 

1 char * fgets(char * s,int size,FILE * stream);

 函數說明

fgets()用來從參數stream所指的文件內讀入字符並存到參數s所指的內存空間,直到出現換行字符、讀到文件尾或是已讀了size-1個字符為止,最后會加上NULL作為字符串結束。
返回值
gets()若成功則返回s指針,返回NULL則表示有錯誤發生。

 10、fputs(將一指定的字符串寫入文件內)

頭文件

1 #include<stdio.h>

 定義函數 

1 int fputs(const char * s,FILE * stream);

 函數說明

fputs()用來將參數s所指的字符串寫入到參數stream所指的文件內。
返回值
若成功則返回寫出的字符個數,返回EOF則表示有錯誤發生。

  

(二)內存控制篇

 1、calloc(配置內存空間)

頭文件

1 #include <stdlib.h>

 定義函數 

1 void *calloc(size_t nmemb,size_t size);

 函數說明

calloc()用來配置nmemb個相鄰的內存單位,每一單位的大小為size,並返回指向第一個元素的指針。這和使用下列的方式效果相同:malloc(nmemb*size);不過,在利用calloc()配置內存時會將內存內容初始化為0。
返回值
若配置成功則返回一指針,失敗則返回NULL。

 2、free(釋放原先配置的內存)

頭文件

1 #include<stdlib.h>

 定義函數 

1 void free(void *ptr);

 函數說明

參數ptr為指向先前由malloc()、calloc()或realloc()所返回的內存指針。調用free()后ptr所指的內存空間便會被收回。假若參數ptr所指的內存空間已被收回或是未知的內存地址,則調用free()可能會有無法預期的情況發生。若參數ptr為NULL,則free()不會有任何作用。

 3、malloc(配置內存空間)

頭文件

1 #include<stdlib.h>

 定義函數 

1 void * malloc(size_t size);

 函數說明

malloc()用來配置內存空間,其大小由指定的size決定。
返回值
若配置成功則返回一指針,失敗則返回NULL。
范例
void p = malloc(1024); /*配置1k的內存*/

 

(三)進程操作篇
1、execl(執行文件)
頭文件

1 #include<unistd.h>

 定義函數 

1 int execl(const char * path,const char * arg,....);

 函數說明

execl()用來執行參數path字符串所代表的文件路徑,接下來的參數代表執行該文件時傳遞過去的argv(0)、argv[1]……,最后一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中。

 2、execlp(從PATH 環境變量中查找文件並執行)

頭文件

#include<unistd.h>

 定義函數 

1 int execlp(const char * file,const char * arg,……);

 函數說明

execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到后便執行該文件,然后將第二個以后的參數當做該文件的argv[0]、argv[1]……,最后一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
參考execve()。 

3、execv(執行文件)
頭文件

1 #include<unistd.h>

 定義函數 

1 int execv (const char * path, char * const argv[ ]);

 函數說明

execv()用來執行參數path字符串所代表的文件路徑,與execl()不同的地方在於execve()只需兩個參數,第二個參數利用數組指針來傳遞給執行文件。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
請參考execve()。

 4、execve(執行文件)

頭文件

1 #include<unistd.h>

 定義函數 

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翻譯器有問題。

 5、execvp(執行文件)

頭文件

1 #include<unistd.h>

 定義函數 

1 int execvp(const char *file ,char * const argv []);

 函數說明

execvp()會從PATH 環境變量所指的目錄中查找符合參數file 的文件名,找到后便執行該文件,然后將第二個參數argv傳給該欲執行的文件。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中。
錯誤代碼
請參考execve()。

 6、exit(正常結束進程)

頭文件

1 #include<stdlib.h>

 定義函數 

1 void exit(int status);

 函數說明

exit()用來正常終結目前進程的執行,並把參數status返回給父進程,而進程所有的緩沖區數據會自動寫回並關閉未關閉的文件。

 7、_exit(結束進程執行)

頭文件

1 #include<unistd.h>

 定義函數 

1 void _exit(int status);

 函數說明

_exit()用來立刻結束目前進程的執行,並把參數status返回給父進程,並關閉未關閉的文件。此函數調用后不會返回,並且會傳遞SIGCHLD信號給父進程,父進程可以由wait函數取得子進程結束狀態。
附加說明
_exit()不會處理標准I/O 緩沖區,如要更新緩沖區請使用exit()。

 

 8、vfork(建立一個新的進程)

頭文件

1 #include<unistd.h>

 定義函數 

1 pid_t vfork(void);

 函數說明

vfork()會產生一個新的子進程,其子進程會復制父進程的數據與堆棧空間,並繼承父進程的用戶代碼,組代碼,環境變量、已打開的文件代碼、工作目錄和資源限制等。Linux 使用copy-on-write(COW)技術,只有當其中一進程試圖修改欲復制的空間時才會做真正的復制動作,由於這些繼承的信息是復制而來,並非指相同的內存空間,因此子進程對這些變量的修改和父進程並不會同步。此外,子進程不會繼承父進程的文件鎖定和未處理的信號。注意,Linux不保證子進程會比父進程先執行或晚執行,因此編寫程序時要留意
死鎖或競爭條件的發生。
返回值
如果vfork()成功則在父進程會返回新建立的子進程代碼(PID),而在新建立的子進程中則返回0。如果vfork 失敗則直接返回-1,失敗原因存於errno中。
錯誤代碼
EAGAIN 內存不足。ENOMEM 內存不足,無法配置核心所需的數據結構空間。

 9、getpid(取得進程識別碼)

頭文件

1 #include<unistd.h>

 定義函數 

1 pid_t getpid(void);

 函數說明

getpid()用來取得目前進程的進程識別碼,許多程序利用取到的此值來建立臨時文件,以避免臨時文件相同帶來的問題。
返回值
目前進程的進程識別碼

 10、getppid(取得父進程的進程識別碼)

頭文件

1 #include<unistd.h>

 定義函數 

1 pid_t getppid(void);

 函數說明

getppid()用來取得目前進程的父進程識別碼。
返回值
目前進程的父進程識別碼。

 11、wait(等待子進程中斷或結束)

頭文件

1 #include<sys/types.h>
2 #include<sys/wait.h>

 定義函數 

1 pid_t wait (int * status);

 函數說明

wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則
參數
status可以設成NULL。子進程的結束狀態值請參考waitpid()。
返回值
如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存於errno中。

 12、waitpid(等待子進程中斷或結束)

頭文件

1 #include<sys/types.h>
2 #include<sys/wait.h>

 定義函數 

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中。

  

(四)信號處理篇
1、sigaction(查詢或設置信號處理方式)
頭文件

1 #include<signal.h>

 定義函數 

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 此調用被中斷

 2、sigaddset(增加一個信號至信號集)

頭文件

1 #include<signal.h>

 定義函數 

1 int sigaddset(sigset_t *set,int signum);

 函數說明

sigaddset()用來將參數signum 代表的信號加入至參數set 信號集里。
返回值
執行成功則返回0,如果有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址無法存取
EINVAL 參數signum非合法的信號編號

 3、sigdelset(從信號集里刪除一個信號)

頭文件

1 #include<signal.h>

 定義函數 

1 int sigdelset(sigset_t * set,int signum);

 函數說明

sigdelset()用來將參數signum代表的信號從參數set信號集里刪除。
返回值
執行成功則返回0,如果有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址無法存取
EINVAL 參數signum非合法的信號編號

 4、sigemptyset(初始化信號集)

頭文件

1 #include<signal.h>

 定義函數 

1 int sigemptyset(sigset_t *set);

 函數說明

sigemptyset()用來將參數set信號集初始化並清空。
返回值
執行成功則返回0,如果有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址無法存取

 5、sigfillset(將所有信號加入至信號集)

頭文件

1 #include<signal.h>

 定義函數 

1 int sigfillset(sigset_t * set);

 函數說明

sigfillset()用來將參數set信號集初始化,然后把所有的信號加入到此信號集里。
返回值
執行成功則返回0,如果有錯誤則返回-1。
附加說明
EFAULT 參數set指針地址無法存取

 6、sigismember(測試某個信號是否已加入至信號集里)

頭文件

1 #include<signal.h>

 定義函數 

1 int sigismember(const sigset_t *set,int signum);

 函數說明

sigismember()用來測試參數signum 代表的信號是否已加入至參數set信號集里。如果信號集里已有該信號則返回1,否則返回0。
返回值
信號集已有該信號則返回1,沒有則返回0。如果有錯誤則返回-1。
錯誤代碼
EFAULT 參數set指針地址無法存取
EINVAL 參數signum 非合法的信號編號

 7、signal(設置信號處理方式)

頭文件

1 #include<signal.h>

 定義函數 

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()。

 8、sleep(讓進程暫停執行一段時間)

頭文件

1 #include<unistd.h>

 定義函數 

1 unsigned int sleep(unsigned int seconds);

 函數說明

sleep()會令目前的進程暫停,直到達到參數seconds 所指定的時間,或是被信號所中斷。
返回值
若進程暫停到參數seconds 所指定的時間則返回0,若有信號中斷則返回剩余秒數。

 9、perror(打印出錯誤原因信息字符串)

頭文件

1 #include<stdio.h>

 定義函數 

1 void perror(const char *s);

 函數說明

perror()用來將上一個函數發生錯誤的原因輸出到標准錯誤(stderr)。參數s所指的字符串會先打印出,后面再加上錯誤原因字符串。此
錯誤原因依照全局變量errno的值來決定要輸出的字符串。
返回值

 10、mkfifo(建立具名管道)

頭文件

1 #include<sys/types.h>
2 #include<sys/stat.h>

 定義函數 

1 int mkfifo(const char * pathname,mode_t mode);

 函數說明

mkfifo()會依參數pathname建立特殊的FIFO文件,該文件必須不存在,而參數mode為該文件的權限(mode%~umask),因此 umask值也會
影響到FIFO文件的權限。Mkfifo()建立的FIFO文件其他進程都可以用讀寫一般文件的方式存取。當使用open()來打開 FIFO文件時,
O_NONBLOCK旗標會有影響
1、當使用O_NONBLOCK 旗標時,打開FIFO 文件來讀取的操作會立刻返回,但是若還沒有其他進程打開FIFO 文件來讀取,則寫入的操作會
返回ENXIO 錯誤代碼。
2、沒有使用O_NONBLOCK 旗標時,打開FIFO 來讀取的操作會等到其他進程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫
入的操作會等到其他進程打開FIFO 文件來讀取后才正常返回。
返回值
若成功則返回0,否則返回-1,錯誤原因存於errno中。
錯誤代碼
EACCESS 參數pathname所指定的目錄路徑無可執行的權限
EEXIST 參數pathname所指定的文件已存在。
ENAMETOOLONG 參數pathname的路徑名稱太長。
ENOENT 參數pathname包含的目錄不存在
ENOSPC 文件系統的剩余空間不足
ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。
EROFS 參數pathname指定的文件存在於只讀文件系統內。

 11、pclose(關閉管道I/O)

頭文件

1 #include<stdio.h>

 定義函數 

1 int pclose(FILE * stream);

 函數說明

pclose()用來關閉由popen所建立的管道及文件指針。參數stream為先前由popen()所返回的文件指針。
返回值
返回子進程的結束狀態。如果有錯誤則返回-1,錯誤原因存於errno中。
錯誤代碼
ECHILD pclose()無法取得子進程的結束狀態。

 12、pipe(建立管道)

頭文件

1 #include<unistd.h>

 定義函數 

1 int pipe(int filedes[2]);

 函數說明

pipe()會建立管道,並將文件描述詞由參數filedes數組返回。filedes[0]為管道里的讀取端,filedes[1]則為管道的寫入端。
返回值
若成功則返回零,否則返回-1,錯誤原因存於errno中。
錯誤代碼
EMFILE 進程已用完文件描述詞最大量。
ENFILE 系統已無文件描述詞可用。
EFAULT 參數filedes數組地址不合法。

 13、popen(建立管道I/O)

頭文件

1 #include<stdio.h>

 定義函數 

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()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

  

(五)接口處理篇
1、accept(接受socket連線)
頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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 核心內存不足。

 2、bind(對socket定位)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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。

 3、connect(建立socket連線)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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為不可阻斷且先前的連線操作還未完成。

 4、htonl(將32位主機字符順序轉換成網絡字符順序)

頭文件

1 #include<netinet/in.h>

 定義函數 

1 unsigned long int htonl(unsigned long int hostlong);

 函數說明

htonl()用來將參數指定的32位hostlong 轉換成網絡字符順序。
返回值
返回對應的網絡字符順序。

 5、htons(將16位主機字符順序轉換成網絡字符順序)

頭文件

1 #include<netinet/in.h>

 定義函數 

1 unsigned short int htons(unsigned short int hostshort);

 函數說明

htons()用來將參數指定的16位hostshort轉換成網絡字符順序。
返回值
返回對應的網絡字符順序。

 6、inet_addr(將網絡地址轉成二進制的數字)

頭文件

1 #include<sys/socket.h>
2 #include<netinet/in.h>
3 #include<arpa/inet.h>

 定義函數 

1 unsigned long int inet_addr(const char *cp);

 函數說明

inet_addr()用來將參數cp所指的網絡地址字符串轉換成網絡所使用的二進制數字。網絡地址字符串是以數字和點組成的字符串,例
如:“163.13.132.68”。
返回值
成功則返回對應的網絡二進制的數字,失敗返回-1。

 7、inet_aton(將網絡地址轉成網絡二進制的數字)

頭文件

1 #include<sys/scoket.h>
2 #include<netinet/in.h>
3 #include<arpa/inet.h>

 定義函數 

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。

 

8、inet_ntoa(將網絡二進制的數字轉換成網絡地址)
頭文件

1 #include<sys/socket.h>
2 #include<netinet/in.h>
3 #include<arpa/inet.h>

 定義函數 

1 char * inet_ntoa(struct in_addr in);

 函數說明

inet_ntoa()用來將參數in所指的網絡二進制的數字轉換成網絡地址,然后將指向此網絡地址字符串的指針返回。
返回值
成功則返回字符串指針,失敗則返回NULL。

 9、listen(等待連接)

頭文件

1 #include<sys/socket.h>

 定義函數 

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模式。

 10、ntohl(將32位網絡字符順序轉換成主機字符順序)

頭文件

1 #include<netinet/in.h>

 定義函數 

1 unsigned long int ntohl(unsigned long int netlong);

 函數說明

ntohl()用來將參數指定的32位netlong轉換成主機字符順序。
返回值
返回對應的主機字符順序。

 11、ntohs(將16位網絡字符順序轉換成主機字符順序)

頭文件

1 #include<netinet/in.h>

 定義函數 

1 unsigned short int ntohs(unsigned short int netshort);

 函數說明

ntohs()用來將參數指定的16位netshort轉換成主機字符順序。
返回值
返回對應的主機順序。

 12、recv(經socket接收數據)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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 傳給系統調用的參數不正確。

 13、recvfrom(經socket接收數據)

相關函數
recv,recvmsg,send,sendto,socket
頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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 傳給系統調用的參數不正確。

 14、recvmsg(經socket接收數據)

頭文件

1 #include<sys/types.h>
2 #include<sys/socktet.h>

 定義函數 

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 傳給系統調用的參數不正確。

 15、send(經socket傳送數據)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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 傳給系統調用的參數不正確。

 16、sendmsg(經socket傳送數據)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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 傳給系統調用的參數不正確。

 17、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 傳給系統調用的參數不正確。

 18、socket(建立一個socket通信)

頭文件

1 #include<sys/types.h>
2 #include<sys/socket.h>

 定義函數 

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不合法

 

(六)環境變量篇
1、getenv(取得環境變量內容)
頭文件

1 #include<stdlib.h>

 定義函數 

1 char * getenv(const char *name);

 函數說明

getenv()用來取得參數name環境變量的內容。參數name為環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格
式為name=value。
返回值
執行成功則返回指向該內容的指針,找不到符合的環境變量名稱則返回NULL。

 2、putenv(改變或增加環境變量)

頭文件

1 #include <stdlib.h>

 定義函數 

1 int putenv(const char * string);

 函數說明

putenv()用來改變或增加環境變量的內容。參數string的格式為name=value,如果該環境變量原先存在,則變量內容會依參數string改
變,否則此參數內容會成為新的環境變量。
返回值
執行成功則返回0,有錯誤發生則返回-1。
錯誤代碼
ENOMEM 內存不足,無法配置新的環境變量空間。

 3、setenv(改變或增加環境變量)

頭文件

1 #include<stdlib.h>

 定義函數 

1 int setenv(const char *name,const char * value,int overwrite);

 函數說明

setenv()用來改變或增加環境變量的內容。參數name為環境變量名稱字符串。
參數
value則為變量內容,參數overwrite用來決定是否要改變已存在的環境變量。如果overwrite不為0,而該環境變量原已有內容,則原內
容會被改為參數value所指的變量內容。如果overwrite為0,且該環境變量已有內容,則參數value會被忽略。
返回值
執行成功則返回0,有錯誤發生時返回-1。
錯誤代碼
ENOMEM 內存不足,無法配置新的環境變量空間

 

(七)內存及字符串操作篇
1、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 值,否則返回非零值。

 2、bcopy(拷貝內存內容)

頭文件

1 #include <string.h>

 定義函數 

1 void bcopy ( const void *src,void *dest ,int n);

 函數說明

bcopy()與memcpy()一樣都是用來拷貝src所指的內存內容前n個字節到dest所指的地址,不過參數src與dest在傳給函數時是相反的位置。
返回值

 3、bzero(將一段內存內容全清為零)

頭文件

1 #include<string.h>

 定義函數 

1 void bzero(void *s,int n);

 函數說明

bzero()會將參數s所指的內存區域前n個字節,全部設為零值。相當於調用memset((void*)s,0,size_tn);

 4、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的字節。

 5、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的值。

 6、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所指的內存區域不可重疊。

 7、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之間。

 8、strlen(返回字符串長度)

頭文件

1 #include<string.h>

 定義函數 

1 size_t strlen (const char *s);

 函數說明

strlen()用來計算指定的字符串s的長度,不包括結束字符"\0"。
返回值
返回字符串s的字符數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM