1. 程式人生 > >linux高階程式設計常用的系統呼叫函式整理

linux高階程式設計常用的系統呼叫函式整理

這一個月來,因為電腦原因,沒有過多的進行Android方面的開發,而是選擇了學習Linux/Unix高階程式設計方面的知識,目前到了總結階段。現貼出學習過程中遇到的基本系統呼叫函式,方便以後查詢和回憶,接下來也將更新自己的學習總結和理解。

動態載入共享庫函式

需要的新增的標頭檔案  
#include <dlfcn.h>
編譯時需要加上的引數   -ldl

函式系列:
1.void *dlopen(const char *filename,int flag);

功能:載入一個動態庫檔案,當這個庫檔案被重複載入的時候,函式只返回同一個地址,並且dl庫中維護的引用計數會加一。
      也就是說,如果返回成功,則會使引用計數+1。不同的是首次載入時,會把庫檔案載入到記憶體,並返回該記憶體的地址值
       ,不是首次載入時,則只返回地址值,同時增加引用計數。
引數:
    filename  指定要載入的庫檔案的名字
    flag      RTLD_LAZY   延遲繫結   
              RTLD_NOW    立即載入
返回值:
    成功=> 返回一個地址。
    失敗=> NULL

2.char *dlerror(void);

功能:返回最近的錯誤資訊。錯誤資訊由dlopen、dlclose、dlsym函式呼叫產生。
引數:void
返回值:成功返回錯誤資訊,如果返回NULL,代表沒有錯誤

3.void *dlsym(void *handle,const char *symbol);

功能:是將handle指向的動態庫中的symbol載入到記憶體中
引數:
    handle  是dlopen函式的返回值
    symbol   是要載入到記憶體的符號 
返回值:
    symbol被載入到記憶體中的地址

4.int dlclose(void *handle);

功能:讓庫檔案的引用量減一,如果這個引用量減為0,同時其他的載入庫沒有使用庫中的symbol時,這個動態庫就會被解除安裝
引數: handle  是dlopen函式的返回值
返回值:    0  正確返回
        非0 失敗返回

錯誤處理相關函式

需要包含的標頭檔案
 #include <errno.h>
errno.h標頭檔案定義了一個整型的全域性變數errno,當系統呼叫或者一些庫函式發生錯誤時設定errno,通過errno值發現錯誤資訊

處理函式:

1.void perror(const char *s);

需要包含的標頭檔案    
#include <stdio.h>

功能: 列印系統錯誤資訊
引數:s  字串,一般是系統呼叫或者庫函式的呼叫函式名
返回值:void

2.char *strerror(int errnum);

需要包含的標頭檔案
#include <string.h>

功能:根據錯誤號返回一個描述錯誤資訊的字串
引數: errnum:  錯誤編號
返回值:該字串的首地址

操作環境變數的函式

需要包含的標頭檔案
#include <stdlib.h>

函式系列
1.char *getenv(const char *name);

功能:獲取name指定的環境變數的值。
引數:name  環境變數的名字
返回值: NULL: 沒有找到環境變數的值 =>失敗
    指向環境變數值的地址   =>成功

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

功能:改變或新增環境變數
引數:
    name:代表了環境變數的名字
    value:環境變數的值
    overwrite:判斷環境變數的名字存在的時候,是否改變環境變數的值
        引數選擇:   0   不改變
                    非0  改變
返回值:
    0 代表成功
    -1 代表失敗  並且設定errno的值

3.int unsetenv(const char *name);

功能:從環境變數列表中,刪除name指定的環境變數
引數:
    name:環境變數的名字
返回值:
    0 代表成功
    -1 代表失敗  並且設定errno的值

4.int putenv(char *string);

功能:改變或新增一個環境變數
引數:
    string   name=value的形式
         如果name在環境列表中不存在,則往列表中新增該環境
         如果name在環境列表中存在,則改變該環境的值value  
返回值:
    0代表成功
    非0 代表失敗

mmap記憶體對映系列引數

需要新增的標頭檔案
#include <sys/mman.h>

函式系列:
1.void *mmap(void *addr, size_t len,int prot, int flags,int fildes, off_t off);

功能:在呼叫該方法的程序的虛擬地址空間建立一個新的對映,起始地址由addr決定,長度由length指定

引數:
addr:   NULL 由系統自動分配
    非NULL  在建議的地址上分配
len:    指定了對映的長度
prot:
    PROT_READ           Data can be read.
    PROT_WRITE          Data can be written.
    PROT_EXEC           Data can be executed.
    PROT_NONE           Data cannot be accessed.

flags:
    MAP_PRIVATE     私有的,只能被自己看到
    MAP_ANONYMOUS   匿名檔案   將記憶體對映過來

fileds: 檔案描述符 0
off:    檔案的偏移位置 0
返回值:
    失敗:返回MAP_FAILED 
    成功:返回一個指向該對映空間的地址

2.int munmap(void *addr, size_t len);

功能:解除對映
引數:
    addr:mmap的返回值
    len:mmap裡的len值
返回值:
    0代表成功
    -1代表失敗,並設定errno

檔案操作函式

需要包含的標頭檔案
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

函式系列

1.
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int open(const char *pathname, int flags,…);

功能:開啟一個檔案或者裝置
引數:
pathname:檔案的路徑名字 
flags:
以下三個只能包含其中一個
O_RDONLY   只讀方式開啟
O_WRONLY   只寫方式開啟
O_RDWR     讀寫方式開啟

以下的引數可用或的方式進行拼接

檔案建立的標記:
O_CREAT 檔案不存在,則建立檔案,建立檔案的時候,需要指定檔案的許可權。
O_TRUNC 這個標記不能和只讀標記一起使用,開啟一個檔案,如果檔案不存在,建立這個檔案。如果檔案存在,將檔案內容清空為0;
O_EXCL  和O_CREAT一起使用,要建立的檔案已經存在的時候,呼叫失敗。

檔案狀態的標記
O_APPEND   追加的方式開啟檔案

mode:指定檔案的許可權,當建立檔案時,需要這個引數申明檔案的許可權


返回值:
    成功:返回檔案的描述符。
    失敗:返回-1,errno被設定

注意:在mode中宣告的檔案許可權需要和umask進行與操作,才能確定最終的檔案許可權
mode & ~umask
umask 稱為許可權掩碼,可以用umask命令用來察看umask掩碼,也可以用“umask  許可權數字”這樣的指令來改變umask掩碼的值

2.int close(int fd);

功能:關閉檔案
引數:
fd: open的時候建立的檔案描述符
返回值:
    0 代表成功
    -1 代表失敗  errno被設定

3.ssize_t read(int fd, void *buf, size_t count);

功能:從指定的檔案描述符中讀取內容
引數:
    fd: open返回的檔案描述符
    buf:讀取內容到buf指定的記憶體空間裡
    count:我想要讀取的位元組的個數
返回值:
    失敗:返回-1  errno被設定
    成功:返回的是實際讀取到的位元組數。如果是0,代表到達了檔案的尾部

4.ssize_t write(int fd, const void *buf,size_t count);

功能:往檔案中寫入資料
引數:
    fd:open函式的返回值
    buf: 將buf指向的記憶體中的資料寫入到fd指向的檔案中
    count:想要寫入檔案的位元組數
返回值:
    失敗:返回-1 errno被設定
    成功:返回實際寫入檔案的位元組數

5.off_t lseek(int fd, off_t offset,int whence);

需要額外包含的標頭檔案
#include <sys/types.h>

功能:改變檔案進行都寫操作時的偏移量
引數:
    fd:  open函式的返回值
    offset: 偏移位置
    whence:
        SEEK_SET   檔案的開頭
        SEEK_CUR   當前位置
        SEEK_END   檔案末尾
返回值:
    失敗:返回-1,errno被設定
    成功:返回位置

檔案描述符的複製函式

需要包含的標頭檔案
#include <unistd.h>

1.int dup(int oldfd);

功能:複製檔案描述符
引數:oldfd   要複製的檔案描述符
返回值:
    成功:返回新的檔案描述符
    失敗:返回-1  errno被設定

2.int dup2(int oldfd, int newfd);

功能:複製檔案描述符
引數:
    oldfd     舊的檔案描述符
    newfd     新的檔案描述符
返回值:
    成功:返回新的檔案描述符
    失敗:返回-1   errno被設定

操作檔案鎖函式

需要包含的標頭檔案: 
#include <unistd.h>
#include <fcntl.h>

1.int fcntl(int fd, int cmd, … /* arg */ );

功能:操作檔案描述符,為其設定檔案操作鎖
引數:
    fd: open 函式的返回值
    cmd:
        F_GETLK,    獲得一個鎖
        F_SETLK ,  設定一個鎖,如果已經有一把互斥鎖
            F_SETLKW ,  釋放一個等待的鎖(F_SETLKD的阻塞版本)
    引數結構體:第三個引數 
        struct flock {
                   ...
                   short l_type;    /* Type of lock: F_RDLCK,           讀,寫,解鎖。
                                     F_WRLCK, F_UNLCK */
                   short l_whence;  /* How to interpret l_start:         鎖的位置。  ---
                                     SEEK_SET, SEEK_CUR, SEEK_END */        
                   off_t l_start;   /* Starting offset for lock */       開始偏移量 ---    這三個引數確定鎖的開始位置及長度。
                   off_t l_len;     /* Number of bytes to lock */       鎖的長度   ---
                   pid_t l_pid;     /* PID of process blocking our lock         
                                         (F_GETLK only) */
                    ...
             };


返回值:
    0代表成功。
    -1 代表失敗,errno被設定。

獲取檔案的元資料操作

1.int stat(const char *path, struct stat *buf);

需要包含的標頭檔案
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <unistd.h>

功能:  得到檔案的相關資訊
引數:
    buf:返回檔案的描述結構體指標,當函式返回0時,可在buf中察看檔案的元資料資訊
    path:檔案路徑名。
返回值:0 成功
    -1 失敗,errno被設定。

檔案的描述結構體指標
struct stat {
                   dev_t     st_dev;     /* ID of device containing file */
           ino_t     st_ino;     /* inode number */     inode號
           mode_t    st_mode;    /* protection */       許可權
           nlink_t   st_nlink;   /* number of hard links */ 硬連結數
           uid_t     st_uid;     /* user ID of owner */     使用者id
           gid_t     st_gid;     /* group ID of owner */    組ID
           dev_t     st_rdev;    /* device ID (if special file) */ 
           off_t     st_size;    /* total size, in bytes */ 檔案長度
           blksize_t st_blksize; /* blocksize for file system I/O */
           blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
           time_t    st_atime;   /* time of last access */  最後一次訪問的時間
           time_t    st_mtime;   /* time of last modification */    最後修改的時間
           time_t    st_ctime;   /* time of last status change */ 最後一次狀態改變的時間
       };

2.struct passwd *getpwuid(uid_t uid);

需要包含的標頭檔案
#include <sys/types.h>
    #include <pwd.h>

功能:返回一個指向密碼資料庫中與使用者id引數匹配的相關資料的指標
引數:uid 使用者的id
返回值:一個結構體指標,結構體成員定義如下:
struct passwd {
           char   *pw_name;       /* username */
           char   *pw_passwd;     /* user password */
           uid_t   pw_uid;        /* user ID */
           gid_t   pw_gid;        /* group ID */
           char   *pw_gecos;      /* user information */
           char   *pw_dir;        /* home directory */
           char   *pw_shell;      /* shell program */
       };

3.struct group *getgrgid(gid_t gid);

需要包含的標頭檔案:
#include <sys/types.h>
    #include <grp.h>

功能:返回一個指向使用者組資料庫中與組id引數匹配的相關資料的指標
引數:gid 組id
返回值:
       struct group {
           char   *gr_name;       /* group name */
           char   *gr_passwd;     /* group password */
           gid_t   gr_gid;        /* group ID */
           char  **gr_mem;        /* group members */
       };

資料夾操作函式

需要包含的標頭檔案
#include <sys/types.h>
#include <dirent.h>

1.DIR *opendir(const char *name);

功能:開啟一個資料夾
引數:
    name  資料夾的名字
返回值:
    失敗:NULL errno被設定
    成功:返回一個指向資料夾流首地址

2.int closedir(DIR *dirp);

功能:關閉一個資料夾
引數:
    dirp  opendir的返回值
返回值:
    0 成功
    -1 失敗  errno被設定

3.struct dirent *readdir(DIR *dirp);

功能:讀取資料夾內容,返回dirent指標
引數:
    dirp  opendir函式的返回值
返回值:
    NULL   失敗或者到達了檔案的末尾
    如果是失敗 errno被設定,如果是到達檔案末尾,errno沒有被設定
    返回一個地址  成功
    struct dirent {
           ino_t  d_ino; /*inode number */
           off_t  d_off; /*offset to the next dirent */
           unsigned short d_reclen; /*length of this record */
           unsigned char  d_type; /*type of file; not supported by all file system types */
           char   d_name[256]; /* filename */
    };

在程式中獲得自己的程序id函式

需要包含的標頭檔案
#include <sys/types.h>
#include <unistd.h>

1.pid_t getpid(void);
2.pid_t getppid(void);

功能:1.獲取呼叫程序的pid
     2.獲取呼叫程序的父pid
引數:void
返回值:見功能

在程式中建立新程序的函式

需要包含的標頭檔案
#include <unistd.h>

1.pid_t fork(void);

功能:建立一個子程序
引數:void
返回值:
    失敗:返回-1  errno被設定
    成功:返回兩個值
        在父程序裡     子程序的pid
        在子程序裡      0

程序退出時執行相關操作的函式:

需要包含的標頭檔案
#include <stdlib.h>

1.int atexit(void (*function)(void));

功能:註冊一個函式,在程序退出的時候,呼叫他
引數:void (*function)(void)函式    
返回值:
    0 成功
    非0 失敗、

2.int on_exit(void (function)(int , void ), void *arg);

功能:註冊一個函式,在程序退出的時候,呼叫他
引數:
    void (*function)(int , void *):函式名
    void *arg:函式引數
返回值:
    0 成功
    非0 失敗

程序退出函式

需要包含的標頭檔案
 #include <unistd.h>

1.void _exit(int status);

功能:終止當前呼叫程序
引數:父程序退出程序的狀態碼,可以在wait函式中察看
返回值:void

保持程序同步的函式

需要包含的標頭檔案
#include <sys/types.h>
#include <sys/wait.h>

1.pid_t wait(int *status);

功能:等待子程序的結束
引數:
    status:獲取子程序的結束狀態碼
返回值:
    成功:子程序的pid
    失敗:-1 
附:
WIFEXITED(status)用來判斷子程序是否正常終止
WEXITSTATUS(status)獲取子程序正常終止的狀態碼

2.pid_t waitpid(pid_t pid,int *status,int options);

功能:等待子程序的結束
引數:
    pid  指定等待的子程序,引數見下
        <-1  等待gid等於pid引數絕對值的程序 
        -1   等待任意一個子程序
        0    等待gid等於父程序的gid的程序
        >0   等待程序pid等於引數pid的程序

    status  子程序的退出狀態
    options  選項
        WNOHANG  如果沒有子程序退出,立即返回
        0      阻塞

返回值:
    子程序的pid
    如果指定的子程序的狀態沒有改變   0  
    -1 失敗

程式的裝入系列函式=》exec函式組

需要包含的標頭檔案
#include <unistd.h>
全域性環境遍量:extern char **environ;

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

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

3.int execle(const char *path,const char *arg,…,char *const envp[]);

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

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

6.int execvpe(const char *file,char *const argv[],char *const envp[]);

功能:在程序中裝載一個可執行檔案
引數:
    path   要載入的程式的路徑
    file   要載入的程式的名字,具體路徑由PATH環境變數提供
    arg    list   arg0 arg1 arg2...
        arg0必須和程式的檔名一致   
        最後一個肯定是(char *)NULL
    envp: 傳環境變數。
    argv:  array  這個陣列的第一個元素需要跟可執行檔案的
            名字一致。最後一個元素需要是NULL。

返回值:
    在出現錯誤的時候,才被返回,返回值是-1,errno被設定。

區分:在exec函式組中,exec為函式字首,後面的第一個字母決定引數為arg(list)還是argv(array),兩者分別對應l和v
在函式中,p代表檔案路徑由Path環境變數提供,第一個引數只需要填寫檔名
     沒有p代表需要第一個引數為要載入系統的環境路徑
     e代表需要傳入相關的環境變數

建立一個無名管道:

需要的標頭檔案:
#include <unistd.h>

1.int pipe(int pipefd[2]);

功能:建立一個管道。返回兩個檔案描述符
引數:
    pipefd[2]
    pipefd[0]   讀端
    pipefd[1]   寫端

返回值:
    0 成功
    -1 失敗  errno被設定

建立一個有名管道:

需要包含的標頭檔案:
#include <sys/types.h>
#include <sys/stat.h>

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

功能:建立一個有名管道
引數:
    pathname: 檔案路徑的名字
    mode:許可權
返回值:
    0 成功
    -1 失敗   errno被設定

獲取當前目錄的絕對路徑函式

需要包含的標頭檔案    
#include <unistd.h>

1.char *getcwd(char *buf, size_t size);

功能:返回一個字串,表示當前呼叫程序的工作目錄的絕對路徑
引數:
    buf  把當前工作目錄的絕對路徑複製到buf中
    size buf空間的大小
返回值:成功返回當前工作目錄
    失敗返回FAISE

訊號註冊函式

需要包含的標頭檔案    
#include <signal.h> 
//需要宣告的函式型別為void(*)(int),重新命名為sighandler_t;
typedef void (*sighandler_t)(int);

1.sighandler_t signal(int signum,sighandler_t handler);

功能:將handler和signum繫結,並向程序註冊,當收到訊號時,呼叫handler函式
引數:
    signum   訊號編號或者訊號名字
    handler   函式指標型別
返回值:
SIG_ERR   錯誤返回

給程序傳送訊號的函式

1.int kill(pid_t pid, int sig);

需要包含的標頭檔案
#include <sys/types.h>
#include <signal.h>

功能:給pid指定的程序傳送sig訊號
引數:
    pid    程序編號
    sig    訊號的編號
返回值:
    0   成功
    -1 失敗  errno被設定

2.int raise(int sig);

需要包含的標頭檔案:
#include <signal.h>
功能:給自己傳送訊號
引數:
    sig   訊號編號 訊號
返回值:
    0   成功
    非0 失敗

3.unsigned int alarm(unsigned int seconds);

需要包含的標頭檔案
#include <unistd.h>
功能:給程序自己傳送SIGALRM訊號
引數:
    seconds:延時時間
    0    取消alarm的設定
返回值:
    0   沒有預先設定

等待一個訊號的函式

需要的標頭檔案
#include <unistd.h>

1.int pause(void);

功能:等待一個訊號
引數:void
返回值:
-1 代表錯誤,並設定errno。如果errno==EINTR說明被訊號打斷。

處理sigset_t集合的幾個函式

需要包含的標頭檔案
#include <signal.h>

1.int sigemptyset(sigset_t *set);

功能:將set集合裡的內容全部清空,清為0;
引數:
    set   要操作的sigset_t型別的集合,將該集合清空
返回值:
    0 成功
    -1 失敗

2.int sigfillset(sigset_t *set);

功能:將set集合裡的內容全部置1
引數:
    set 要操作的sigset_t型別的集合,將該集合的全部置1
返回值:
    0 成功
    -1 失敗

3.int sigaddset(sigset_t *set, int signum);

功能:給set新增signum指定的訊號。
引數:
    set   集合
    signum  指定的訊號
返回值:
    0  成功
    -1 失敗

4.int sigdelset(sigset_t *set,int signum);

功能:從set集合裡移除signum指定的訊號
引數:
    set 指定的集合
    signum  要移除的訊號
返回值:
    0 成功
    -1 失敗

5.int sigismember(const sigset_t *set,int signum);

功能:測試訊號signum是不是set集合裡的一個成員
引數:
    set  集合
    signum  指定的訊號
返回值:
    1   集合裡有這個訊號
    0  集合裡沒有這個訊號
    -1 失敗錯誤

訊號阻塞的操作函式

需要包含的標頭檔案
#include <signal.h>

1.int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);

功能:檢查和改變訊號的阻塞,
引數:
    how:
        SIG_BLOCK  set指定的集合和程序的set集合並集操作(或)。
        SIG_SETMASK 直接使用set集合裡的值來設定
        SIG_UNBLOCK ~set和當前程序的set做與操作
    set: 指定的集合
    oset:原先的舊的集合
返回值:
    0   成功
    -1 失敗 errno被設定

2.int sigpending(sigset_t *set);

功能:檢查未決訊號
引數:
    set:用於獲取未決訊號集合
返回值:
    0  成功
    -1 失敗 errno被設定

訊息佇列的相關操作函式

1.key_t ftok(const char *pathname,int proj_id);

需要包含的標頭檔案:
#include <sys/types.h>
#include <sys/ipc.h>
功能:將pathname和proj_id轉換為system v IPC鍵值
引數:
    pathname: 存在的,可以訪問的,有效的檔名
    proj_id:0~255
返回值:
    失敗:返回-1  errno被設定
    成功:返回鍵值

2.int msgget(key_t key, int msgflg);

需要包含的標頭檔案
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

功能:得到一個和key相關聯的訊息佇列 id
引數:
    key:ftok函式的返回值
    msgflg:
    IPC_CREAT  如果沒有於key想關聯的訊息佇列,則建立訊息佇列
    IPC_EXCL 和IPC_CREAT一起使用,如果訊息佇列存在,則報錯,errno被設定為EEXIST
返回值:
    失敗:返回-1  errno被設定
    成功:返回訊息佇列的id

3.int msgsnd(int msqid,const void *msgp,size_t msgsz, int msgflg);

需要包含的標頭檔案:
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
功能:向訊息佇列傳送訊息
引數:
    msqid: msgget函式的返回值
    msgp: 訊息內容的地址
    msgsz:訊息佇列資料的長度
    msgflg:
        0  當訊息佇列的空間不足的時候,阻塞
        IPC_NOWAIT 訊息佇列空間不足的時候,函式立即返回錯誤程式碼,錯誤資訊為EAGAIN

返回值:
    0 成功
    -1 失敗 errno被設定

4.ssize_t msgrcv(int msqid, void *msgp,size_t msgsz, long msgtyp,int msgflg);

    需要包含的標頭檔案:
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>

    功能:從訊息佇列接受訊息
    引數:
        msqid:函式msgget的返回值
        msgp:從訊息對列裡接受訊息到msgp指定的地址裡
        msgsz:訊息佇列的長度
        msgtyp:指定接收的訊息型別
        msgflg:IPC_NOWAIT 

    返回值:
        -1 失敗  errno被設定
        接收到的訊息體的長度。

共享記憶體的相關操作

1.ftok(3) 參見訊息佇列這個函式的介紹

2.int shmget(key_t key,size_t size,int shmflg);

需要包含的標頭檔案:
#include <sys/ipc.h>
#include <sys/shm.h>

功能:分配一塊共享記憶體
引數:
    key:  ftok(3)的返回值
    size: 向系統申請分配的記憶體大小。以頁為單位
    shmflg:
        IPC_CREAT
        IPC_EXCL    
        mode_flags

    返回值:
    失敗:返回-1 
    成功:返回共享記憶體的id

3.void *shmat(int shmid, const void *shmaddr, int shmflg);

需要包含的標頭檔案:
#include <sys/types.h>
#include <sys/shm.h>

功能:獲得共享記憶體對映到程序的虛擬地址
引數:
    shmaddr  NULL
    shmid    shmget(2)的返回值
    shmflg:
    SHM_RDONLY  對共享記憶體  只讀

返回值:
    失敗:返回 (void *) -1  錯誤  errno被設定
    成功:返回虛擬地址

4.int shmdt(const void *shmaddr);

需要包含的標頭檔案:
#include <sys/types.h>
#include <sys/shm.h>

功能:解除共享記憶體的對映
引數:
    shmaddr   shmat(2)的返回值
返回值:
    0 成功
    -1 失敗

網路程式設計的相關操作函式:

基於TCP程式設計的服務端函式

步驟:

a)使用socket建立通訊端

b)將sockfd和伺服器的地址、埠繫結

c)監聽套接字

d) accpet等待客戶端發來的請求

e)提取客戶端發來的資料、進行資料處理、迴應客戶端

f)關閉連線

系列函式:

需要的標頭檔案
#include  <sys/types.h>     /*See NOTES */
#include <sys/socket.h>

1.int socket(int domain,int type,int protocol);

功能:建立一個用於通訊的端點
引數:
    domain:
        AF_INET   用於ipv4協議家族
        AF_INET6  用於ipv6協議家族

    type:   
        SOCK_STREAM:指明採用TCP傳輸層協議
        SOCK_DGRAM:指明採用UDP傳輸層協議

    protocol:
        常設定為0   
返回值:
    失敗 :返回 -1 錯誤 errno被設定
    成功 :返回一個用於通訊的檔案描述符

2.int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:將一個socket和name繫結
引數:
    sockfd:socket函式呼叫成功返回的檔案描述符
    addr:一個用於設定接收地址和設定通訊埠的結構體指標
    addrlen:addr指向的記憶體的長度
返回值:
    0 成功
    -1 失敗  errno被設定
結構體指標定義如下:
    struct sockaddr {
           sa_family_t sa_family;
           char        sa_data[14];
    }
為定義方便,基於上面指標重新指定新的結構體:
    struct sockaddr_in   用於ipv4
    struct sockaddr_in6  用於ipv6

3.int listen(int sockfd, int backlog);

功能:堅挺套接字上的連線
引數:
    sockfd: socket(2)的返回值
    backlog: 未決連線,表示可監聽的個數
返回值:
    0 成功
    -1 失敗 errno被設定

4.int accept(int sockfd, struct sockaddr *addr,socklen_t *addrlen);

功能:接收sockfd指定的連線
引數:
    sockfd:socket(2)的返回值
    addr:接收網路socket的地址,如果設定為NULL,不影響連線,但不能顯示相關資訊。
    addrlen:addr指向記憶體的長度
返回值:
    -1 失敗  errno被設定
    accept檔案描述符   

5.read(connfd,buf,size);

功能:見檔案操作函式read

6.write(connfd,buf,size);

功能:見檔案操作函式write

7.close(connfd);

關閉連線

大端小端轉換相關函式:

需要的標頭檔案
#include <arpa/inet.h> 

1. const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);

功能:將網路地址指標表示的文字或二進位制格式轉換為字串格式
引數:
    af: 指定使用ipv4還是ipv6
    src:指定地址->sin_addr.s_addr
    dst:轉化後的字串格式儲存的地方
    size:dst的大小
返回值:成功:返回一個指向dst的非空指標
    失敗:NULL,錯誤值被設定

2.int inet_pton(int af, const char *src, void *dst);

功能:將點分十進位制轉換為網路的格式
引數:
    af  :  AF_INET  IPV4
        AF_INET6  ipv6
    src: 字串格式的ip地址
    dst:網路格式的ip地址儲存區
返回值:
    1  成功
    -1 失敗  errno被設定

3.int inet_aton(const char *cp, struct in_addr *inp);

需要包含的標頭檔案
#include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

功能:將點分十進位制的主機ip地址轉化為struct in_addr型別的網路地址
引數:
    cp:需要轉化的點分十進位制引數
    inp:轉化後的結果儲存區
返回值:
    0  失敗
    非0 成功

4.char *inet_ntoa(struct in_addr in);

功能:將struct in_addr型別的網路地址轉換為點分十進位制的字串格式。
引數:
in  網路地址
返回值:
    點分十進位制的字串

網路地址與主機地址相互轉化的相關函式

需要包含的標頭檔案
#include <arpa/inet.h>

1.uint32_t htonl(uint32_t hostlong);
2.uint16_t htons(uint16_t hostshort);
3.uint32_t ntohl(uint32_t netlong);
4.uint16_t ntohs(uint16_t netshort);

方法描述:
轉化源格式 to 傳化後格式 儲存值型別
比如: htonl
h  hostaddr 主機地址
n  netaddr  網路地址
l  32位無符號整型的int型別
s  16位無符號整型的int型別

基於tcp的客戶端連線:

步驟

a)建立socket(見socket方法)

b)使用sockfd和伺服器端連線

c)業務處理(見read/write方法)

1.int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

需要包含的標頭檔案
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

功能:在socket(2)返回的檔案描述符上啟動一個連線
引數:
    sockfd:socket(2)的返回值
    addr: 伺服器的地址
    addrlen:伺服器地址結構的長度
返回值:
    0 成功
    -1 失敗 errno被設定

UDP程式設計的相關引數

1.ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr, socklen_t *addrlen);

需要包含的標頭檔案
#include <sys/types.h>
#include <sys/socket.h>

功能:從socket接收訊息
引數:
    sockfd:socket(2)的返回值
    buf:用來儲存接收到的資訊
    len:成功得到訊息的長度
    flags:取0
    src_addr:通訊對方的網路地址和埠號
    addrlen:src_addr指向的結構體的長度。
返回值:
    -1 錯誤
    接收到的資訊的位元組數

2.ssize_t sendto(int sockfd, const void *buf,size_t len, int flags,const struct sockaddr *dest_addr,socklen_t addrlen);

需要包含的標頭檔案
#include <sys/types.h>
#include <sys/socket.h>

功能:通過socket傳送一個訊息
引數:
    sockfd:socket(2)返回值
    buf:要傳送的資料存放的地址
    len:要傳送的資料的長度
    flags:0
    dest_addr:目標的網路地址和埠號
    addrlen:dest_addr的長度
返回值:
    -1 錯誤 errno被設定
    傳送出去的位元組數

關於執行緒的基本操作函式

需要包含的標頭檔案
#include <pthread.h>
編譯時需要加上的引數 -pthread

1.int pthread_create(pthread_t thread, const pthread_attr_t *attr,void (start_routine) (void ),void *arg);

功能:建立一個執行緒
引數:
    thread:帶回執行緒的id
    attr:一般設定為NULL
    start_routine:執行緒的執行函式
    arg:是start_routine函式的引數

返回值:
    成功:0 
    失敗:返回一個錯誤number。

2.pthread_t pthread_self(void);

功能:獲取呼叫該函式的執行緒id。
引數:
    void  不需要引數
返回值:
    返回呼叫該函式的執行緒的id。

3.void pthread_exit(void *retval);

功能:終止呼叫該函式的執行緒,返回一個可被同進程中的其他執行緒捕獲的值(如果該執行緒處於join狀態的話)
引數:
    retval,可被其他執行緒捕獲的引數
返回值:
    void

4.int pthread_cancel(pthread_t thread);

功能: 向執行緒傳送一個終止請求
引數:
    thread  向這個thread傳送終止請求
返回值:
    0   成功
    非0 失敗 錯誤的編號

5.int pthread_join(pthread_t thread, void **retval);

功能: 等待一個執行緒結束,如果這個執行緒已經終止,則方法立即返回
引數: 
    thread:等待終止的執行緒
    retval:判斷執行緒終止的原因
返回值:
    0 成功
    非0 錯誤  錯誤編碼

6.int pthread_detach(pthread_t thread);

功能:分離一個執行緒
引數:
    thread   指定一個要分離的執行緒
返回值:
    0 成功
    非0  失敗

執行緒間同步的相關函式

mutex鎖的系列函式

1.int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);

功能:初始化mutex鎖
引數:
    mutex:要初始化的mutex鎖
    mutexattr:NULL
返回值:
    0 always

2.int pthread_mutex_lock(pthread_mutex_t *mutex);

功能: 上鎖mutex,如果沒有其他執行緒上鎖,立即上鎖,並返回,如果有其他執行緒上鎖,掛起等待其他執行緒釋放鎖。
引數:
    mutex  要上的鎖
返回值:
    0 成功
    非0 失敗

3.int pthread_mutex_trylock(pthread_mutex_t *mutex);

功能:嘗試加鎖,如果其他執行緒沒有上鎖,立即上鎖,正確返回。如果其他執行緒上鎖,立即返回錯誤
引數:
    mutex:要上的鎖
返回值:
    0 成功
    非0 失敗

4.int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能: 解鎖
引數:
    mutex  要操作的鎖
返回值:
    0 成功
    非0 失敗

5.int pthread_mutex_destroy(pthread_mutex_t *mutex);

功能:銷燬鎖
引數:
    mutex  要銷燬的鎖
返回值:
    0 成功
    非0 失敗

條件變數函式系列:

1.pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

功能: 靜態初始化一個條件變數

2.int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);

功能: 動態初始化一個條件變數
引數:
    cond:要初始化的條件變數
    cond_attr:指定為預設屬性,NULL
返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

3.int pthread_cond_signal(pthread_cond_t *cond);

功能: 向等待的一個執行緒傳送啟用訊號
引數:
    cond:  等待的條件變數
返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

4.int pthread_cond_broadcast(pthread_cond_t *cond);

功能: 給所有等待條件變數的執行緒傳送訊號
引數:
    cond: 等待的條件變數
返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

5.int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

功能:等待某個條件變數
引數:
    cond: 等待的條件變數
    mutex:  加鎖
返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

6.int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *abstime);

功能: 等待某個條件變數,如果超時,返回錯誤,錯誤碼ETIMEDOUT。
引數:
    cond:等待的條件變數
    mutex:加鎖
    abstime:等待的時間

返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

7.int pthread_cond_destroy(pthread_cond_t *cond);

功能: 銷燬條件變數
引數:
    cond:要銷燬的條件變數
返回值:
    0  成功
    非0 失敗 代表的是錯誤碼

訊號量集函式系列:

需要的包含的標頭檔案
#include <semaphore.h>
編譯的時候要加上-lrt 或者-pthread.

1.int sem_init(sem_t *sem, int pshared,unsigned int value);

功能: 初始化訊號量集
引數:
    sem:sem就是要初始化的訊號量集
    pshared: 0一個程序中的多個執行緒
    value:指定了訊號集中的資源的數量
返回值:
    0 成功
    -1 失敗  errno被設定

2.int sem_destroy(sem_t *sem);

功能: 銷燬訊號量集
引數:
    sem:    指定銷燬的訊號量集
返回值:
    0 成功
    -1 失敗   errno被設定

3.int sem_post(sem_t *sem);

功能:釋放資源,給指定的訊號量集加1
引數:
sem:指定的訊號量集
返回值:
0 成功
-1 失敗 errno被設定

4.int sem_wait(sem_t *sem);

功能:使訊號量集的值-1,如果訊號量集的值為0,等待。直到訊號量集的值大於0;
引數:
    sem: 指定要操作的訊號量集
返回值:
    0 成功
    -1 失敗  errno被設定