本文主要是介绍Linux 进程与线程相关函数及进程间通信方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、与进程基本信息相关的函数
二、进程控制相关的函数
一、进程退出相关函数
二、进程资源回收相关函数
三、进程执行新程序相关函数(exec 函数族)
四、其他函数
一、线程创建相关函数
二、线程退出相关函数
三、线程回收相关函数
四、线程属性设置相关函数
五、线程清理相关函数
一、线程互斥相关函数
二、线程同步(信号量)相关函数
一、无名管道相关函数
二、有名管道相关函数
三、信号发送相关函数
四、信号接收相关函数
一、共享内存相关函数
二、信号量集相关函数
一、与进程基本信息相关的函数
-
pid_t fork()
:- 功能:从当前进程中克隆一个同名新进程,子进程是父进程的完全拷贝,子进程的执行过程是从 fork 函数之后执行。
- 返回值:在父进程中,成功返回值是子进程的 pid 号(>0),失败返回 -1;在子进程中,成功返回值 0,失败无返回值。
- 应用场合:一个进程希望复制自己,使父子进程同时执行相同的代码段(网络服务中常见);一个进程需要执行一个不同的程序(fork + exec)。
-
pid_t getpid(void)
:- 功能:获得调用该函数进程的 pid。
- 参数:缺省。
- 返回值:进程的 pid。
-
pid_t getppid(void)
:- 功能:获得调用该函数进程的父进程 pid 号。
- 参数:缺省。
- 返回值:返回父进程 id 号。
二、进程控制相关的函数
kill
和killall
:用于发送信号给进程,以控制进程的行为。kill -2 PID
:发送信号给指定 PID 的进程,默认接收者关闭。killall -9 进程名
:发送信号给指定进程名对应的所有进程。
一、进程退出相关函数
-
exit(int status)
:- 功能:让进程退出,并刷新缓冲区。会执行 I/O 库的清理工作,关闭所有的流以及所有打开的文件,执行清理函数(atexit)。
- 参数:status 为进程退出的状态。
- 返回值:缺省。
- 常用退出状态:EXIT_SUCCESS(0)表示正常结束;EXIT_FAILURE(1)表示异常结束。
-
_exit(int status)
:- 功能:让进程退出,不刷新缓冲区。
- 参数:status 为进程退出状态。
- 返回值:缺省。
-
atexit(void (*function)(void))
:- 功能:注册进程退出前执行的函数。
- 参数:function 为函数指针,指向 void 返回值、void 参数的函数指针。
- 返回值:成功返回 0,失败返回非 0。当程序调用
exit
或者由main
函数执行return
时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用。
二、进程资源回收相关函数
-
pid_t wait(int *status)
:- 功能:该函数可以阻塞等待任意子进程退出,并回收该进程的状态。一般用于父进程回收子进程状态。
- 参数:status 为进程退出时候的状态,如果不关心其退出状态一般用
NULL
表示;如果要回收进程退出状态,则用WEXITSTATUS
回收。 - 返回值:成功回收的子进程
pid
,失败返回 -1。
-
pid_t waitpid(pid_t pid, int *status, int options)
:- 功能:回收指定子进程资源。
< -1
回收指定进程组内的任意子进程;-1
回收任意子进程(组内外);0
回收和当前调用waitpid
一个组的所有子进程(组内);> 0
回收指定 ID 的子进程。 - 参数:
pid
为指定子进程 ID;status 为子进程退出时候的状态,如果不关注退出状态用NULL
;options 为选项,0
表示回收过程会阻塞等待,WNOHANG
表示非阻塞模式(不会等子进程退出)回收资源。 - 返回值:成功返回接收资源的子进程
pid
,失败返回 -1,返回 0 表示没有子进程退出。
- 功能:回收指定子进程资源。
三、进程执行新程序相关函数(exec 函数族)
int execl(const char *path, const char *arg,...)
:以路径名作为参数,需要将参数一个一个列出,并以NULL
结尾。int execv(const char *path, char *const argv[])
:以路径名作为参数,需要构造一个参数指针数组,然后将数组的地址传入。int execle(const char *path, const char *arg,..., char *const envp[])
:以路径名作为参数,可传入一个指向环境字符串的指针数组的指针,其他未指定环境变量,使用父进程继承过来的。int execve(const char *path, char *const argv[], char *const envp[])
:真正的系统调用,以路径名作为参数,可传入环境变量指针数组,参数传递方式与execv
相同。int execlp(const char *file, const char *arg,...)
:以文件名做参数,当filename
中含有/
时视为路径名,否则按PATH
变量在指定目录下查找可执行文件,参数传递方式与execl
相同。int execvp(const char *file, char *const argv[])
:以文件名做参数,参数传递方式与execv
相同。
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错则返回 -1。
四、其他函数
int system(const char *command)
:- 功能:使用该函数可以将 shell 命令直接在代码中执行。
- 参数:command 要执行的 shell 命令。
- 返回值:成功返回 0,失败返回 -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
为回调函数的参数。 - 返回值:成功返回 0,失败返回错误码。
-
pthread_t pthread_self(void)
:- 功能:获取当前线程的线程 ID。
- 参数:无。
- 返回值:成功返回当前线程的线程 ID,失败返回 -1。
二、线程退出相关函数
-
void pthread_exit(void *retval)
:- 功能:子线程自行退出。
- 参数:
retval
为线程退出时候的返回状态,临死遗言。 - 返回值:无。
-
int pthread_cancel(pthread_t thread)
:- 功能:请求结束一个线程。
- 参数:
thread
为请求结束的线程 ID。 - 返回值:成功返回 0,失败返回 -1。
三、线程回收相关函数
int pthread_join(pthread_t thread, void **retval)
:
- 功能:将指定的线程资源回收,具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。
- 参数:
thread
为要回收的子线程 ID;retval
为要回收的子线程返回值 / 状态。 - 返回值:成功返回 0,失败返回 -1。
四、线程属性设置相关函数
-
int pthread_attr_init(pthread_attr_t *attr)
:- 功能:初始化一个
attr
的变量。 - 参数:
attr
为需要变量来接受初始值。 - 返回值:成功返回 0,非 0 表示错误。
- 功能:初始化一个
-
int pthread_attr_destroy(pthread_attr_t *attr)
:- 功能:销毁
attr
变量。 - 参数:
attr
为属性变量。 - 返回值:成功返回 0,非 0 表示错误。
- 功能:销毁
-
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
:- 功能:把一个线程设置成相应的属性。
- 参数:
attr
为属性变量,由pthread_attr_init
函数初始化;detachstate
有两个可选值,PTHREAD_CREATE_DETACHED
设置分离属性。
-
int pthread_detach(pthread_t thread)
:- 功能:设置分离属性。
- 参数:线程 ID。
五、线程清理相关函数
-
void pthread_cleanup_push(void (*routine)(void *), void *arg)
:- 功能:注册一个线程清理函数。
- 参数:
routine
为线程清理函数的入口;arg
为清理函数的参数。 - 返回值:无。
-
void pthread_cleanup_pop(int execute)
:- 功能:调用清理函数。
- 参数:
execute
为非 0 时执行清理函数,为 0 时不执行。 - 返回值:无。
一、线程互斥相关函数
-
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
:- 功能:将已经定义好的互斥锁初始化。
- 参数:
mutex
为要初始化的互斥锁;attr
为初始化的值,一般是NULL
表示默认锁。 - 返回值:成功返回 0,失败返回非零。
-
int pthread_mutex_lock(pthread_mutex_t *mutex)
:- 功能:用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程 / 线程都不能操作该部分代码,如果该函数在执行的时候,
mutex
已经被其他部分使用则代码阻塞。 - 参数:
mutex
用来给代码加锁的互斥锁。 - 返回值:成功返回 0,失败返回非零。
- 功能:用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程 / 线程都不能操作该部分代码,如果该函数在执行的时候,
-
int pthread_mutex_unlock(pthread_mutex_t *mutex)
:- 功能:将指定的互斥锁解锁,解锁之后代码不再排他访问,一般加锁解锁同时出现。
- 参数:用来解锁的互斥锁。
- 返回值:成功返回 0,失败返回非零。
-
int pthread_mutex_destroy(pthread_mutex_t *mutex)
:- 功能:使用互斥锁完毕后需要销毁互斥锁。
- 参数:
mutex
要销毁的互斥锁。 - 返回值:成功返回 0,失败返回非零。
-
int pthread_mutex_trylock(pthread_mutex_t *mutex)
:- 功能:类似加锁函数效果,唯一区别就是不阻塞。
- 参数:
mutex
用来加锁的互斥锁。 - 返回值:成功返回 0,失败返回非零或
E_AGAIN
。
二、线程同步(信号量)相关函数
-
int sem_init(sem_t *sem, int pshared, unsigned int value)
:- 功能:将已经定义好的信号量赋值。
- 参数:
sem
为要初始化的信号量;pshared = 0
表示线程间使用信号量,!=0
表示进程间使用信号量;value
信号量的初始值,一般无名信号量都是二值信号量,0 表示红灯,进程暂停阻塞,1 表示绿灯,进程可以通过执行。 - 返回值:成功返回 0,失败返回 -1。
-
int sem_wait(sem_t *sem)
:- 功能:判断当前
sem
信号量是否有资源可用。如果sem
有资源(==1),则申请该资源,程序继续运行;如果sem
没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并继续运行程序。注意:sem
申请资源后会自动执行sem = sem - 1
。 - 参数:
sem
要判断的信号量资源。 - 返回值:成功返回 0,失败返回 -1。
- 功能:判断当前
-
int sem_post(sem_t *sem)
:- 功能:函数可以将指定的
sem
信号量资源释放,并默认执行sem = sem + 1
,线程在该函数上不会阻塞。 - 参数:
sem
要释放资源的信号量。 - 返回值:成功返回 0,失败返回 -1。
- 功能:函数可以将指定的
-
int sem_destroy(sem_t *sem)
:- 功能:使用完毕将指定的信号量销毁。
- 参数:
sem
要销毁的信号量。 - 返回值:成功返回 0,失败返回 -1。
一、无名管道相关函数
int pipe(int pipefd[2])
:- 功能:创建并打开一个无名管道。
- 参数:
pipefd[0]
为无名管道的固定读端;pipefd[1]
为无名管道的固定写端。 - 返回值:成功返回 0,失败返回 -1。
二、有名管道相关函数
-
int mkfifo(const char *pathname, mode_t mode)
:- 功能:在指定的
pathname
路径 + 名称下创建一个权限为mode
的有名管道文件。 - 参数:
pathname
要创建的有名管道路径 + 名称;mode
为 8 进制文件权限。 - 返回值:成功返回 0,失败返回 -1。
- 功能:在指定的
-
int unlink(const char *pathname)
:- 功能:将指定的
pathname
管道文件卸载,同时从文件系统中删除。 - 参数:
pathname
要卸载的有名管道。 - 返回值:成功返回 0,失败返回 -1。
- 功能:将指定的
三、信号发送相关函数
-
int kill(pid_t pid, int sig)
:- 功能:给
pid
进程发送信号为sig
的系统信号(1/64)。 - 参数:
pid
为要接收信号的进程pid
;sig
为当前程序要发送的信号编号。 - 返回值:成功返回 0,失败返回 -1。
- 功能:给
-
int raise(int sig)
:等同于kill(getpid(), int sig)
,给进程自己发送sig
信号。 -
unsigned int alarm(unsigned int seconds)
:定时由系统给当前进程发送信号,也称为闹钟函数。 -
int pause(void)
:进程暂停,不再继续执行,除非收到其他信号。
四、信号接收相关函数
sighandler_t signal(int signum, sighandler_t handler)
:
- 功能:注册信号处理函数。
- 参数:
signum
为要处理的信号编号;handler
为信号处理方式,可以是SIG_DFL
(默认处理)、SIG_IGN
(忽略处理)或自定义函数指针。 - 返回值:成功返回上一次注册的信号处理函数指针,失败返回
SIG_ERR
。
一、共享内存相关函数
-
key_t ftok(const char *pathname, int proj_id)
:- 功能:通过该函数可以将
pathname
指定的路径用来以proj_id
生成唯一的临时键值。 - 参数:
pathname
为路径 + 名称(任意文件,只要不会被删除重建即可);proj_id
为整形的数字,一般用 ASCII 码的单字符表示与参数 1 的运算。 - 返回值:成功返回唯一键值,失败返回 -1。
- 功能:通过该函数可以将
-
int shmget(key_t key, size_t size, int shmflg)
:- 功能:使用唯一键值
key
向内核提出共享内存使用申请。 - 参数:
key
为唯一键值;size
为要申请的共享内存大小;shmflg
为申请的共享内存访问权限,八进制表示,如果是第一个申请,则用IPC_CREAT
,如果要检测是否存在,用IPC_EXCL
。 - 返回值:成功返回共享内存
id
(一般用shmid
表示),失败返回 -1。
- 功能:使用唯一键值
-
void *shmat(int shmid, const void *shmaddr, int shmflg)
:- 功能:将指定
shmid
对应的共享内存映射到本地内存。 - 参数:
shmid
为要映射的本地内存;shmaddr
为本地可用的地址,如果不确定则用NULL
,表示由系统自动分配;shmflg
为 0 表示读写,SHM_RDONLY
表示只读。 - 返回值:成功返回映射的地址(一般等于
shmaddr
),失败返回(void*)-1
。
- 功能:将指定
-
int shmdt(const void *shmaddr)
:- 功能:将本地内存与共享内存断开映射关系。
- 参数:
shmaddr
为要断开的映射地址。 - 返回值:成功返回 0,失败返回 -1。
-
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
:- 功能:修改共享内存属性,也可以删除指定的共享内存对象。
- 参数:
shmid
为要删除的共享内存对象;cmd
为IPC_RMID
(删除对象的宏);buf
为NULL
表示只删除对象。 - 返回值:成功返回 0,失败返回 -1。
二、信号量集相关函数
-
int semget(key_t key, int nsems, int semflg)
:- 功能:通过唯一键值向内核提出信号量申请。
- 参数:
key
为唯一键值;nsems
为要申请的信号量个数;semflg
为申请的信号量的访问权限。 - 返回值:成功返回
semid
,失败返回 -1。
-
int semop(int semid, struct sembuf *sops, unsigned nsops)
:- 功能:修改指定信号量集中信号量的值。
- 参数:
semid
为信号量集id
;sops
为结构体指针,结构体成员包括信号量集中信号量的编号(sem_num
)、信号量的PV
操作(sem_op
,-1 表示P
操作,1 表示V
操作,0 表示阻塞)、信号量的操作方式(sem_flg
,0 表示默认阻塞,IPC_NOWAIT
和SEM_UNDO
为可选标志);nsops
为信号量的设置值个数。 - 返回值:成功返回 0,失败返回 -1。
-
int semctl(int semid, int semnum, int cmd,...)
:- 功能:根据
semid
删除指定的信号量集。 - 参数:
semid
为要删除的信号量集;semnum
为要删除的信号量集中的信号量的编号;cmd
为IPC_RMID
(删除对象宏);可变长参数可以不写。 - 返回值:成功返回 0,失败返回 -1。
- 功能:根据
这篇关于Linux 进程与线程相关函数及进程间通信方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!