




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、(一)文件操作篇 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()函數。返
2、回值creat()會返回新的文件描述詞,若有錯誤發生則會返回-1,并把錯誤代碼設給errno。EEXIST 參數pathname所指的文件已存在。EACCESS 參數pathname 所指定的文件不符合所要求測試的權限EROFS 欲打開寫入權限的文件存在于只讀文件系統內EFAULT 參數pathname 指針超出可存取的內存空間EINVAL 參數mode 不正確。ENAMETOOLONG 參數pathname太長。ENOTDIR 參數pathname為一目錄ENOMEM 核心內存不足ELOOP 參數pathname有過多符號連接問題。EMFILE 已達到進程可同時打開的文件數上限ENFILE
3、已達到系統可同時打開的文件數上限附加說明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 所
4、能使用的旗標:O_RDONLY 以只讀方式打開文件O_WRONLY 以只寫方式打開文件O_RDWR 以可讀寫方式打開文件。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。O_CREAT 若欲打開的文件不存在則自動建立該文件。O_EXCL 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,并且欲打開的文件為符號連接,則會打開文件失敗。O_NOCTTY 如果欲打開的文件為終端機設備時,則不會將該終端機當成進程控制終端機。O_TRUNC 若文件存在并且以可寫的方
5、式打開時,此旗標會令文件長度清為0,而原來存于該文件的資料也會消失。O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件后面。O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程之中。O_NDELAY 同O_NONBLOCK。O_SYNC 以同步的方式打開文件。O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接,則會令打開文件失敗。O_DIRECTORY 如果參數pathname 所指的文件并非為一目錄,則會令打開文件失敗。此為Linux2.2以后特有的旗標,以避免一些系統安全問題。參數mod
6、e 則有下列數種組合,只有在建立新文件時才會生效,此外真正建文件時的權限會受到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 權限,代表該文
7、件用戶組具有可讀的權限。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_
8、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)
9、; 函數說明當使用完文件后若已不再需要則可使用close()關閉該文件,二close()會讓數據寫回磁盤,并釋放該文件所占用的資源。參數fd為先前由open()或creat()所返回的文件描述詞。返回值若文件順利關閉則返回0,發生錯誤時返回-1。錯誤代碼EBADF 參數fd 非有效的文件描述詞或該文件已關閉。附加說明雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行關閉文件,并確實檢查返回值。 4、read(由已打開的文件讀取數據)頭文件1 #include<unistd.h> 定義函數 1 ssize_t read(int fd,v
10、oid * buf ,size_t count); 函數說明read()會把參數fd 所指的文件傳送count個字節到buf指針所指的內存中。若參數count為0,則read()不會有作用并返回0。返回值為實際讀取到的字節數,如果返回0,表示已到達文件尾或是無可讀取的數據,此外文件讀寫位置會隨讀取到的字節移動。附加說明如果順利read()會返回實際讀到的字節數,最好能將返回值與參數count 作比較,若返回的字節數比要求讀取的字節數少,則有可能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()被信號中斷了讀取動作。當有錯誤發生時則返回-1,錯誤代碼存入errno中,而文
11、件讀寫位置則無法預期。錯誤代碼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所指的文件內。當然,文件讀寫位置也會隨之移動。返
12、回值如果順利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所指的文件做各種鎖定或
13、解除鎖定的動作。此函數只能鎖定整個文件,無法鎖定文件的某一區域。參數operation有下列四種情況:LOCK_SH 建立共享鎖定。多個進程可同時對同一個文件作共享鎖定。LOCK_EX 建立互斥鎖定。一個文件同時只有一個互斥鎖定。LOCK_UN 解除文件鎖定狀態。LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回進程。通常與LOCK_SH或LOCK_EX 做OR(|)組合。單一文件無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時文件描述詞不會繼承此種鎖定。返回值返回0表示成功,若有錯誤則返回-1,錯誤代碼存于errno。 7、lseek(移動文件的讀寫位置)
14、頭文件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來
15、移動讀寫位置的位移數。參數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
16、,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,
17、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_
18、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 作用相同,但是無法建立鎖定時,此調用會一直等到鎖定動作成功為止。若在等待鎖定的過程中被信號中斷時,會立
19、即返回-1,錯誤代碼為EINTR。參數lock指針為flock 結構指針,定義如下1 struct flcok2 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 也有三種方式:SE
20、EK_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個字符為止
21、,最后會加上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
22、 <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
23、 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()用來配置內存空間,
24、其大小由指定的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)、argv1,最后一個參數必須用空指針(NULL)作結束。返回值如果執行成功
25、則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno中。 2、execlp(從PATH 環境變量中查找文件并執行)頭文件#include<unistd.h> 定義函數 1 int execlp(const char * file,const char * arg,); 函數說明execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到后便執行該文件,然后將第二個以后的參數當做該文件的argv0、argv1,最后一個參數必須用空指針(NULL)作結束。返回值如果執行成功則函數不會返回,執行失敗則直接返回-1,
26、失敗原因存于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
27、、execve(執行文件)頭文件1 #include<unistd.h> 定義函數 1 int execve(const char * filename,char * const argv ,char * const envp ); 函數說明execve()用來執行參數filename字符串所代表的文件路徑,第二個參數系利用數組指針來傳遞給執行文件,最后一個參數則為傳遞給執行文件的新環境變量數組。返回值如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存于errno 中。錯誤代碼EACCES1. 欲執行的文件不具有用戶可執行的權限。2. 欲執
28、行的文件所屬的文件系統是以noexec 方式掛上。3.欲執行的文件或script翻譯器非一般文件。EPERM1.進程處于被追蹤模式,執行者并不具有root權限,欲執行的文件具有SUID 或SGID 位。2.欲執行的文件所屬的文件系統是以nosuid方式掛上,欲執行的文件具有SUID 或SGID 位元,但執行者并不具有root權限。E2BIG 參數數組過大ENOEXEC 無法判斷欲執行文件的執行文件格式,有可能是格式錯誤或無法在此平臺執行。EFAULT 參數filename所指的字符串地址超出可存取空間范圍。ENAMETOOLONG 參數filename所指的字符串太長。ENOENT 參數fil
29、ename字符串所指定的文件不存在。ENOMEM 核心內存不足ENOTDIR 參數filename字符串所包含的目錄路徑并非有效目錄EACCES 參數filename字符串所包含的目錄路徑無法存取,權限不足ELOOP 過多的符號連接ETXTBUSY 欲執行的文件已被其他進程打開而且正把數據寫入該文件中EIO I/O 存取錯誤ENFILE 已達到系統所允許的打開文件總數。EMFILE 已達到系統所允許單一進程所能打開的文件總數。EINVAL 欲執行文件的ELF執行格式不只一個PT_INTERP節區EISDIR ELF翻譯器為一目錄ELIBBAD ELF翻譯器有問題。 5、execvp(
30、執行文件)頭文件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> 定義函
31、數 1 void exit(int status); 函數說明exit()用來正常終結目前進程的執行,并把參數status返回給父進程,而進程所有的緩沖區數據會自動寫回并關閉未關閉的文件。 7、_exit(結束進程執行)頭文件1 #include<unistd.h> 定義函數 1 void _exit(int status); 函數說明_exit()用來立刻結束目前進程的執行,并把參數status返回給父進程,并關閉未關閉的文件。此函數調用后不會返回,并且會傳遞SIGCHLD信號給父進程,父進程可以由wait函數取得子進程
32、結束狀態。附加說明_exit()不會處理標準I/O 緩沖區,如要更新緩沖區請使用exit()。 8、vfork(建立一個新的進程)頭文件1 #include<unistd.h> 定義函數 1 pid_t vfork(void); 函數說明vfork()會產生一個新的子進程,其子進程會復制父進程的數據與堆棧空間,并繼承父進程的用戶代碼,組代碼,環境變量、已打開的文件代碼、工作目錄和資源限制等。Linux 使用copy-on-write(COW)技術,只有當其中一進程試圖修改欲復制的空間時才會做真正的復制動作,由于這些繼承的信息是復制
33、而來,并非指相同的內存空間,因此子進程對這些變量的修改和父進程并不會同步。此外,子進程不會繼承父進程的文件鎖定和未處理的信號。注意,Linux不保證子進程會比父進程先執行或晚執行,因此編寫程序時要留意死鎖或競爭條件的發生。返回值如果vfork()成功則在父進程會返回新建立的子進程代碼(PID),而在新建立的子進程中則返回0。如果vfork 失敗則直接返回-1,失敗原因存于errno中。錯誤代碼EAGAIN 內存不足。ENOMEM 內存不足,無法配置核心所需的數據結構空間。 9、getpid(取得進程識別碼)頭文件1 #include<unistd.h> 定義函數
34、 1 pid_t getpid(void); 函數說明getpid()用來取得目前進程的進程識別碼,許多程序利用取到的此值來建立臨時文件,以避免臨時文件相同帶來的問題。返回值目前進程的進程識別碼 10、getppid(取得父進程的進程識別碼)頭文件1 #include<unistd.h> 定義函數 1 pid_t getppid(void); 函數說明getppid()用來取得目前進程的父進程識別碼。返回值目前進程的父進程識別碼。 11、wait(等待子進程中斷或結束)頭文件1 #include<sys/t
35、ypes.h>2 #include<sys/wait.h> 定義函數 1 pid_t wait (int * status); 函數說明wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數status可以設成NULL。子進程的結束狀態值請參考waitpid()。返回值如果執行成功則返回子進程識別碼(PID),如果有錯誤發生則返回-1。失敗原因存于
36、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返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,
37、則參數status可以設成 NULL。參數pid為欲等待的子進程識別碼,其他數值意義如下:pid<-1 等待進程組識別碼為pid絕對值的任何子進程。pid=-1 等待任何子進程,相當于wait()。pid=0 等待進程組識別碼與目前進程相同的任何子進程。pid>0 等待任何子進程識別碼為pid的子進程。參數option可以為0 或下面的OR 組合WNOHANG 如果沒有任何已經結束的子進程則馬上返回,不予以等待。WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束狀態不予以理會。子進程的結束狀態返回后存于status,底下有幾個宏可判別結束情況WIFEXITED(sta
38、tus)如果子進程正常結束則為非0值。WEXITSTATUS(status)取得子進程exit()返回的結束代碼,一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏。WIFSIGNALED(status)如果子進程是因為信號而結束則此宏值為真WTERMSIG(status)取得子進程因信號而中止的信號代碼,一般會先用WIFSIGNALED 來判斷后才使用此宏。WIFSTOPPED(status)如果子進程處于暫停執行情況則此宏值為真。一般只有使用WUNTRACED 時才會有此情況。WSTOPSIG(status)取得引發子進程暫停的信號代碼,一般會先用WIFSTOPPED 來判斷后才
39、使用此宏。返回值如果執行成功則返回子進程識別碼(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和SIGS
40、TOP以外的所有信號。如參數結構sigaction定義如下1 struct sigaction2 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 用來設置信號處理的其他相關操作,下列的數值可用。
41、OR 運算(|)組合A_NOCLDSTOP : 如果參數signum為SIGCHLD,則當子進程暫停時并不會通知父進程SA_ONESHOT/SA_RESETHAND:當調用新的信號處理函數前,將此信號處理方式改為系統預設的方式。SA_RESTART:被信號中斷的系統調用會自行重啟SA_NOMASK/SA_NODEFER:在處理此信號未結束前不理會此信號的再次到來。如果參數oldact不是NULL指針,則原來的信號處理方式會由此結構sigaction 返回。返回值執行成功則返回0,如果有錯誤則返回-1。錯誤代碼EINVAL 參數signum 不合法, 或是企圖攔截SIGKILL/SIGSTOPS
42、IGKILL信號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、sigdel
43、set(從信號集里刪除一個信號)頭文件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 in
44、t 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,如果有錯誤則返回
45、-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指針地址無法存取EINV
46、AL 參數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 指定的信號重
47、設為核心預設的信號處理方式。關于信號的編號和說明,請參考附錄D返回值返回先前的信號處理函數指針,如果有錯誤則返回SIG_ERR(-1)。附加說明在信號發生跳轉到自定的handler處理函數執行后,系統會自動將此處理函數換回原來系統預設的處理方式,如果要改變此操作請改用sigaction()。 8、sleep(讓進程暫停執行一段時間)頭文件1 #include<unistd.h> 定義函數 1 unsigned int sleep(unsigned int seconds); 函數說明sleep()會令目前的進程暫停,直到達到參數seconds
48、 所指定的時間,或是被信號所中斷。返回值若進程暫停到參數seconds 所指定的時間則返回0,若有信號中斷則返回剩余秒數。 9、perror(打印出錯誤原因信息字符串)頭文件1 #include<stdio.h> 定義函數 1 void perror(const char *s); 函數說明perror()用來將上一個函數發生錯誤的原因輸出到標準錯誤(stderr)。參數s所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量errno的值來決定要輸出的字符串。返回值 10、mkfifo(建立具名管道)頭文件1 #
49、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
50、_NONBLOCK 旗標時,打開FIFO 文件來讀取的操作會立刻返回,但是若還沒有其他進程打開FIFO 文件來讀取,則寫入的操作會返回ENXIO 錯誤代碼。2、沒有使用O_NONBLOCK 旗標時,打開FIFO 來讀取的操作會等到其他進程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫入的操作會等到其他進程打開FIFO 文件來讀取后才正常返回。返回值若成功則返回0,否則返回-1,錯誤原因存于errno中。錯誤代碼EACCESS 參數pathname所指定的目錄路徑無可執行的權限EEXIST 參數pathname所指定的文件已存在。ENAMETOOLONG 參數pathname的路
51、徑名稱太長。ENOENT 參數pathname包含的目錄不存在ENOSPC 文件系統的剩余空間不足ENOTDIR 參數pathname路徑中的目錄存在但卻非真正的目錄。EROFS 參數pathname指定的文件存在于只讀文件系統內。 11、pclose(關閉管道I/O)頭文件1 #include<stdio.h> 定義函數 1 int pclose(FILE * stream); 函數說明pclose()用來關閉由popen所建立的管道及文件指針。參數stream為先前由popen()所返回的文件指針。返回值返回子進程的結束狀態。如果有錯誤則
52、返回-1,錯誤原因存于errno中。錯誤代碼ECHILD pclose()無法取得子進程的結束狀態。 12、pipe(建立管道)頭文件1 #include<unistd.h> 定義函數 1 int pipe(int filedes2); 函數說明pipe()會建立管道,并將文件描述詞由參數filedes數組返回。filedes0為管道里的讀取端,filedes1則為管道的寫入端。返回值若成功則返回零,否則返回-1,錯誤原因存于errno中。錯誤代碼EMFILE 進程已用完文件描述詞最大量。ENFILE 系統已無文件描述詞可用。EFAULT 參
53、數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()會建立管道連到子進程的標準輸出設備或標準輸入設備,然后返回一個文件指針。隨后進程便可利用此文件指針來讀取子
54、進程的輸出設備或是寫入到子進程的標準輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。返回值若成功則返回文件指針,否則返回NULL,錯誤原因存于errno中。錯誤代碼EINVAL參數type不合法。注意事項在編寫具SUID/SGID權限的程序時請盡量避免使用popen(),popen()會繼承環境變量,通過環境變量可能會造成系統安全的問題。 (五)接口處理篇1、accept(接受socket連線)頭文件1 #include<sys/types.h>2 #include<sys/socket.h>
55、60;定義函數 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的結構長度。關于結構soc
56、kaddr的定義請參考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/sock
57、et.h> 定義函數 1 int bind(int sockfd,struct sockaddr * my_addr,int addrlen); 函數說明bind()用來設置給參數sockfd的socket一個名稱。此名稱由參數my_addr指向一sockaddr結構,對于不同的socket domain定義了一個通用的數據結構1 struct sockaddr2 3 unsigned short int sa_family;4 char sa_data14;5 ; sa_family 為調用socket()時的domain參數,即AF_xxxx值
58、。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_zero8; 7 ; 8 struct in_addr 9 10 uint32_t s_addr;11 ; sin_family 即為sa_f
59、amilysin_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); 函數說明con
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語語法試題及答案
- 儲備工廠面試題及答案
- 色牢度桑蠶絲標準
- 2025年食品冷鏈物流溫控技術對冷鏈物流行業發展趨勢研究報告
- 孔院教師入職培訓
- 2025年VXI總線各類卡式儀器項目申請報告模板
- 高中物理45感生電動勢和動生電動勢教案
- 鄉村旅游接待設施2025年設計理念與市場需求分析報告
- 2025年文化旅游演藝項目跨界營銷與品牌影響力拓展報告
- 廣西壯族自治區賀州市昭平縣2025屆年中考三模道德與法治試卷(含答案)
- 急性髓系白血病診斷治療規范經典實用課件
- 學院財務處查閱檔案申請表
- 鑄鐵閘門及啟閉機安裝說明及操作手冊
- 過敏性休克的急救及處理流程教材課件(28張)
- 物理發泡絕緣的生產與應用課件
- 北交所評測20題及答案
- 《消防安全技術實務》課本完整版
- CLSI EP25-A 穩定性考察研究
- SJG 44-2018 深圳市公共建筑節能設計規范-高清現行
- 職工子女暑期工會愛心托管班的方案通知
- (5年高職)客戶服務實務(第二版)教學課件全套電子教案匯總整本書課件最全教學教程完整版教案(最新)
評論
0/150
提交評論