进程线程需要掌握的函数
1 进程相关的系统调用提供的函数
1.1
fork函数
-
pid_t fork(void)
-
函数功能:在当前进程下(当前进程是父进程),创建一个子进程
-
需要的头文件:
#include <sys/types.h>
#include <unistd.h>
-
函数名:fork
-
函数参数:void
-
函数返回值:
0:表示子进程
大于0的整数(子进程的pid):表示父进程
-1:出错
exec函数族
- l:list 以列表方式传参,最后以NULL结束
- v:vector以数组的方式传参,数组的最后一个元素为NULL
- e:env 环境变量,传参方式同数组
- p:PATH,在PATH所指的路径中去找可执行程序
execl函数
-
int execl(const char *path, const char *arg, …)
-
函数功能:用path路径下的进程替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execl
-
函数参数:
path:带路径的可执行文件名
arg:执行可执行文件需要的指令
…:以列表形式传参,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
execle函数
-
int execle(const char *path, const char *arg, …, char *const envp[])
-
函数功能:用path路径下的进程替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execle
-
函数参数:
path:带路径的可执行文件名
arg:执行可执行文件需要的指令
…:以列表形式传参,以NULL结束
envp:预先定义的存放自定义的环境变量的数组,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
execlp函数
-
int execlp(const char *file, const char *arg, …)
-
函数功能:使用环境变量下的可执行文件替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execlp
-
函数参数:
file:环境变量下的可执行文件名,不用加路径
arg:执行可执行文件需要的指令
…:以列表形式传参,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
execv函数
-
int execv(const char *path, char *const argv[])
-
函数功能:用path路径下的进程替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execv
-
函数参数:
path:带路径的可执行文件名
argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
execve函数
-
int execve(const char *path, char *const argv[], char *const envp[])
-
函数功能:用path路径下的进程替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execve
-
函数参数:
path:带路径的可执行文件名
argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束
envp:预先定义的存放自定义的环境变量的数组,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
execvp函数
-
int execvp(const char *file, char *const argv[])
-
函数功能:使用环境变量下的可执行文件替换当前进程
-
需要的头文件:
#include <unistd.h>
-
函数名:execvp
-
函数参数:
file:环境变量下的可执行文件名,不用加路径
argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束
-
函数返回值:
成功:不会产生返回值
出错:-1
exit/_exit函数
exit函数
-
void exit(int status)
-
函数功能:退出当前进程并刷新IO缓存区
-
需要的头文件:
#include <stdlib.h>
-
函数名:exit
-
函数参数:
status:0表示正常结束;其他数值表示非正常结束
-
函数返回值:void
_exit函数
-
void _exit(int status)
-
函数功能:退出当前进程,不刷新IO缓存
-
需要的头文件:
#include <unistd.h>
-
函数名:_exit
-
函数参数:
status:0表示正常结束;其他数值表示非正常结束
-
函数返回值:void
wait/waitpid函数
wait函数
-
pid_t wait(int *status)
-
函数功能:等待任意子进程的退出状态(第一个退出的子进程)
-
需要的头文件:
#include <sys/types.h>
#include <sys/wait.h> -
函数名:wait
-
函数参数:
status:指向子进程退出状态值的指针
-
函数返回值:
成功:返回等到的子进程的PID
失败:返回-1
waitpid函数
-
pid_t waitpid(pid_t pid, int *status, int options)
-
函数功能:等待指定子进程的退出状态
-
需要的头文件:
#include <sys/types.h>
#include <sys/wait.h> -
函数名:waitpid
-
函数参数:
pid:子进程的PID;
status:指向子进程退出状态值的指针
options:模式选择
0:将waitpid函数变成阻塞函数,若本次调用没有等到结果,则阻塞当前进程;若等到结果,则返回子进程的PID。
WNOHANG:将waitpid函数变成非阻塞函数,若本次调用没有等到子进程则退出,waitpid返回0;若等到结果,waitpid返 回子进程的pid。 -
函数返回值:
>0:已经结束运行的子进程的进程号
0:使用选项WNOHANG且子进程没有退出
-1:出错
1.2 进程通信相关函数
1.2.1 无名管道相关函数
pipe函数
-
int pipe(int fd[2])
-
函数功能:创建无名管道
-
需要的头文件:
#include <unistd.h>
-
函数名:pipe
-
函数参数:
fd:读写操纵数组。(fd[0]:操作管道固定的读端;fd[1]:操作管道固定的写端)
-
函数返回值:
0:创建无名管道成功
-1:创建无名管道失败
1.2.2 有名管道相关函数
mkfifo函数
-
int mkfifo(const char *filename,mode_t mode)
-
函数功能:创建有名管道
-
需要的头文件:
#include <sys/types.h>
#include <sys/stat.h> -
函数名:mkfifo
-
函数参数:
filename:有名管道文件的名称,通常为字符串形式
mode:文件权限(参见文件IO中的文件权限介绍)
-
函数返回值:
0:创建有名管道成功
-1:创建有名管道失败
fgets函数
-
char *fgets(char *s, int size, FILE *stream)
-
函数功能:从文件流指针获取字符串
-
需要的头文件:
#include <stdio.h> -
函数名:fgets
-
函数参数:
s:存储字符的内存首地址
size:获取字符的的数量
stream:文件流指针
-
函数返回值:
s:获取成功返回存储字符的内存首地址
NULL:当发生错误或者没有字符可获取时返回NULL
1.2.3 信号通信相关函数
kill函数
-
int kill(pid_t pid, int sig)
-
函数功能:给进程或进程组发送信号
-
需要的头文件:
#include <sys/types.h>
#include <signal.h>
-
函数名:kill
-
函数参数:
pid:
- 正数:发送信号给进程号为pid的进程
- 0:信号被发送到所有和当前进程在同一个进程组的进程
- -1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
- <-1:信号发送给进程组号为-pid的每一个进程
sig:信号类型
-
函数返回值:
0:发送成功
-1:发送出错
raise函数
-
int raise(int sig)
-
函数功能:让进程向自身发送信号
-
需要的头文件:
#include <sys/types.h>
#include <signal.h>
-
函数名:raise
-
函数参数:
sig:信号类型
-
函数返回值:
0:发送成功
-1:发送出错
alarm函数
-
unsigned int alarm(unsigned int seconds)
-
函数功能:该函数是一个闹铃函数,它可以在进程中设置一个定时器,当定时时间到时,内核就向当前进程发送SIGALRM(终止当前进程)信号。(默认动作可修改)
-
需要的头文件:
#include <unistd.h> -
函数名:alarm
-
函数参数:
seconds:秒数
-
函数返回值:
0:若参数为0,则返回值为0;若该定时器前没有其他定时器,则返回值也为0
大于0的整数:若该定时器前还有别的定时器,返回值是上一个定时器被打断计时后剩余的秒数(若有两个定时器,在没有sleep函数打断的情况下,后一个定时器会把第一个定时器打断,定时时间由第二个定时器的秒数决定,此时被打断的定时器返回值为0,第二个定时器的返回值是第一个定时器被打断计时后剩余的秒数)
注意:最好不要混用sleep或者alarm函数,因为sleep()函数的实现也用到了SIGALRM信号。
pause函数
-
int pause(void)
-
函数功能:挂起当前进程,并等待一个信号的到来,可以捕获信号
-
需要的头文件:
#include <unistd.h>
-
函数名:pause
-
函数参数:
void
-
函数返回值:
-1:pause函数只有等到一个信号的到来才会返回,并且返回值始终为-1,若未等到信号的到来,阻塞
signal函数
-
sighandler_t signal(int signum, sighandler_t handler)
-
函数功能:修改信号对应的默认处理动作,signum会自动给handler传送信号编号
-
需要的头文件:
#include <signal.h>
-
函数名:signal
-
函数参数:
signum:信号代码,它可以取除了SIGKILL和SIGSTOP外的任何一种信号
handler:
typedef void (*sighandler_t)(int):入参int,返回值void
1. 信号对应的新的处理动作函数 1. SIG_IGN:忽略该信号,使该信号失效 1. SIG_DFL:恢复对信号的系统默认处理,使该信号保持系统默认的作用
-
函数返回值:
成功:返回以前的信号处理函数
出错:-1
atoi函数
-
int atoi(const char *nptr)
-
函数功能:将指向存储字符串首地址的指针指向的字符型数据转换为整型数据
-
需要的头文件:
#include <stdlib.h>
-
函数名:atoi
-
函数参数:
nptr:指向字符串首地址的指针
-
函数返回值:
>0的整数:当转换成功时,返回转换后的整数
0:当转换失败时,返回0
2 线程相关的第三方线程库提供的函数
2.1 线程使用相关函数
pthread_create函数
-
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg)//在进程中使用
-
函数功能:创建一个线程
-
需要的头文件:
#include <pthread.h>
-
函数名:pthread_create
-
函数参数:
thread:指向线程id的指针
attr:指向线程属性的指针,通常给NULL
(*start_routine) (void *):指向线程执行函数的指针
arg:传给线程执行函数的入参
-
函数返回值:
0:成功
非0:失败
pthread_join函数
-
int pthread_join(pthread_t thread, void **value_ptr)//在进程中使用
-
函数功能:阻塞等待线程退出,回收线程退出状态值
-
需要的头文件:
#include <pthread.h>
-
函数名:pthread_join
-
函数参数:
thread:线程ID
value_ptr:指向线程退出状态值的指针
-
函数返回值:
0:成功
非0:失败
pthread_exit函数
-
int pthread_exit(void *value_ptr)//在线程中使用
-
函数功能:退出当前线程
-
需要的头文件:
#include <pthread.h>
-
函数名:pthread_exit
-
函数参数:
value_ptr:指向线程退出状态的指针
-
函数返回值:
0:成功
非0:失败
pthread_cancel函数
-
int pthread_cancel(pthread_t thead)//在进程中使用
-
函数功能:取消线程/关闭线程
-
需要的头文件:
#include <pthread.h>
-
函数名:pthread_cancel
-
函数参数:
thead:线程ID
-
函数返回值:
0:成功
非0:失败
2.2 线程同步相关函数
sem_init函数
-
int sem_init(sem_t *sem, int pshared, unsigned int value)
-
函数功能:初始化信号量
-
需要的头文件:
#include <semaphore.h>
-
函数名:sem_init
-
函数参数:
sem:信号量对象
pshared:决定信号量能否在进程间共享,一般为0
value:信号量初始化值
-
函数返回值:
0:初始化成功
-1:初始化失败
sem_wait函数
-
int sem_wait(sem_t *sem)
-
函数功能:获取信号量,若不成功则阻塞。当sem > 0时,函数返回,sem–;当sem=0时,阻塞当前线程
-
需要的头文件:
#include <semaphore.h>
-
函数名:sem_wait
-
函数参数:
sem:信号量对象
-
函数返回值:
0:表示成功
-1:表示出现错误,信号量的值保持不变
sem_post函数
-
int sem_post(sem_t *sem)
-
函数功能:释放信号量。给信号量为0的信号量+1,sem++
-
需要的头文件:
#include <semaphore.h>
-
函数名:sem_post
-
函数参数:
sem:信号量对象
-
函数返回值:
0:表示成功
-1:表示出现错误,信号量的值保持不变
2.3 线程互斥相关函数
pthread_mutex_init函数
-
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)
-
函数功能:初始化互斥锁
-
需要的头文件:#include <pthread.h>
-
函数名:pthread_mutex_init
-
函数参数:
mutex:指向互斥锁对象的指针
attr:互斥锁属性,一般给NULL
-
函数返回值:
0:初始化成功
非0:初始化失败
pthread_mutex_lock函数
-
int pthread_mutex_lock(pthread_mutex_t *mutex)
-
函数功能:给公共资源加锁
-
需要的头文件:#include <pthread.h>
-
函数名:pthread_mutex_lock
-
函数参数:
mutex:指向互斥锁对象的指针
-
函数返回值:
0:加锁成功
非0:加锁失败
pthread_mutex_unlock函数
-
int pthread_mutex_unlock(pthread_mutex_t *mutex)
-
函数功能:给公共资源解锁
-
需要的头文件:#include <pthread.h>
-
函数名:pthread_mutex_unlock
-
函数参数:
mutex:指向互斥锁对象的指针
-
函数返回值:
0:解锁成功
非0:解锁失败