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被設定