linux高级编程常用的系统调用函数整理
2017-08-21 08:32
639 查看
这一个月来,因为电脑原因,没有过多的进行Android方面的开发,而是选择了学习Linux/Unix高级编程方面的知识,目前到了总结阶段。现贴出学习过程中遇到的基本系统调用函数,方便以后查找和回忆,接下来也将更新自己的学习总结和理解。
函数系列:
1.void *dlopen(const char *filename,int flag);
2.char *dlerror(void);
3.void *dlsym(void *handle,const char *symbol);
4.int dlclose(void *handle);
处理函数:
1.void perror(const char *s);
2.char *strerror(int errnum);
函数系列
1.char *getenv(const char *name);
2.int setenv(const char *name, const char *value,int overwrite);
3.int unsetenv(const char *name);
4.int putenv(char *string);
函数系列:
1.void *mmap(void *addr, size_t len,int prot, int flags,int fildes, off_t off);
2.int munmap(void *addr, size_t len);
函数系列
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,…);
2.int close(int fd);
3.ssize_t read(int fd, void *buf, size_t count);
4.ssize_t write(int fd, const void *buf,size_t count);
5.off_t lseek(int fd, off_t offset,int whence);
1.int dup(int oldfd);
2.int dup2(int oldfd, int newfd);
1.int fcntl(int fd, int cmd, … /* arg */ );
2.struct passwd *getpwuid(uid_t uid);
3.struct group *getgrgid(gid_t gid);
1.DIR *opendir(const char *name);
2.int closedir(DIR *dirp);
3.struct dirent *readdir(DIR *dirp);
1.pid_t getpid(void);
2.pid_t getppid(void);
1.pid_t fork(void);
1.int atexit(void (*function)(void));
2.int on_exit(void (function)(int , void ), void *arg);
1.void _exit(int status);
1.pid_t wait(int *status);
2.pid_t waitpid(pid_t pid,int *status,int options);
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[]);
1.int pipe(int pipefd[2]);
1.int mkfifo(const char *pathname, mode_t mode);
1.char *getcwd(char *buf, size_t size);
1.sighandler_t signal(int signum,sighandler_t handler);
2.int raise(int sig);
3.unsigned int alarm(unsigned int seconds);
1.int pause(void);
1.int sigemptyset(sigset_t *set);
2.int sigfillset(sigset_t *set);
3.int sigaddset(sigset_t *set, int signum);
4.int sigdelset(sigset_t *set,int signum);
5.int sigismember(const sigset_t *set,int signum);
1.int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);
2.int sigpending(sigset_t *set);
2.int msgget(key_t key, int msgflg);
3.int msgsnd(int msqid,const void *msgp,size_t msgsz, int msgflg);
4.ssize_t msgrcv(int msqid, void *msgp,size_t msgsz, long msgtyp,int msgflg);
2.int shmget(key_t key,size_t size,int shmflg);
3.void *shmat(int shmid, const void *shmaddr, int shmflg);
4.int shmdt(const void *shmaddr);
1.int socket(int domain,int type,int protocol);
2.int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3.int listen(int sockfd, int backlog);
4.int accept(int sockfd, struct sockaddr *addr,socklen_t *addrlen);
5.read(connfd,buf,size);
6.write(connfd,buf,size);
7.close(connfd);
1. const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
2.int inet_pton(int af, const char *src, void *dst);
3.int inet_aton(const char *cp, struct in_addr *inp);
4.char *inet_ntoa(struct in_addr in);
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);
2.ssize_t sendto(int sockfd, const void *buf,size_t len, int flags,const struct sockaddr *dest_addr,socklen_t addrlen);
1.int pthread_create(pthread_t thread, const pthread_attr_t *attr,void (start_routine) (void ),void *arg);
2.pthread_t pthread_self(void);
3.void pthread_exit(void *retval);
4.int pthread_cancel(pthread_t thread);
5.int pthread_join(pthread_t thread, void **retval);
6.int pthread_detach(pthread_t thread);
2.int pthread_mutex_lock(pthread_mutex_t *mutex);
3.int pthread_mutex_trylock(pthread_mutex_t *mutex);
4.int pthread_mutex_unlock(pthread_mutex_t *mutex);
5.int pthread_mutex_destroy(pthread_mutex_t *mutex);
2.int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
3.int pthread_cond_signal(pthread_cond_t *cond);
4.int pthread_cond_broadcast(pthread_cond_t *cond);
5.int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
6.int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *abstime);
7.int pthread_cond_destroy(pthread_cond_t *cond);
1.int sem_init(sem_t *sem, int pshared,unsigned int value);
2.int sem_destroy(sem_t *sem);
3.int sem_post(sem_t *sem);
4.int sem_wait(sem_t *sem);
动态加载共享库函数
需要的添加的头文件 #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被设置
相关文章推荐
- linux C/C++编程 常用系统函数整理, 持续增加......
- Linux应用程序开发笔记->文件编程之系统调用方式相关函数
- linux常用系统调用函数
- Linux编程常用的函数(十一) 系统数据文件和信息
- 七、Linux系统编程-文件和IO(五)fcntl函数及常用操作、文件锁
- PHP调用Linux系统的常用函数
- Unix高级编程:库函数与系统调用函数区别、文件锁、进程基础
- PHP调用Linux系统的常用函数
- Linux下系统调用文件编程整理
- Linux下C编程:常用系统调用接口小结(2)
- linux常用系统调用函数
- UNIX环境高级编程——Linux系统调用列表
- UNIX环境高级编程——Linux系统调用列表
- linux下c编程系统调用之有名管道FIFO函数的使用及案例
- Linux下C编程:常用系统调用接口小结(1)
- Linux文件编程之--库函数pk系统调用函数
- UNIX环境高级编程——Linux系统调用列表
- UNIX(Linux)系统编程常用库函数说明
- linux常用系统调用函数
- 学习C#高级编程--在重写基类的方法中,如何调用基类的函数