您的位置:首页 > 运维架构 > Linux

linux高级编程常用的系统调用函数整理

2017-08-21 08:32 639 查看
这一个月来,因为电脑原因,没有过多的进行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被设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息