当前位置: 首页 > article >正文

Linux 进程与线程相关函数及进程间通信方法

目录

一、与进程基本信息相关的函数

二、进程控制相关的函数

一、进程退出相关函数

二、进程资源回收相关函数

三、进程执行新程序相关函数(exec 函数族)

四、其他函数

一、线程创建相关函数

二、线程退出相关函数

三、线程回收相关函数

四、线程属性设置相关函数

五、线程清理相关函数

一、线程互斥相关函数

二、线程同步(信号量)相关函数

一、无名管道相关函数

二、有名管道相关函数

三、信号发送相关函数

四、信号接收相关函数

一、共享内存相关函数

二、信号量集相关函数


一、与进程基本信息相关的函数

  1. pid_t fork()

    • 功能:从当前进程中克隆一个同名新进程,子进程是父进程的完全拷贝,子进程的执行过程是从 fork 函数之后执行。
    • 返回值:在父进程中,成功返回值是子进程的 pid 号(>0),失败返回 -1;在子进程中,成功返回值 0,失败无返回值。
    • 应用场合:一个进程希望复制自己,使父子进程同时执行相同的代码段(网络服务中常见);一个进程需要执行一个不同的程序(fork + exec)。
  2. pid_t getpid(void)

    • 功能:获得调用该函数进程的 pid。
    • 参数:缺省。
    • 返回值:进程的 pid。
  3. pid_t getppid(void)

    • 功能:获得调用该函数进程的父进程 pid 号。
    • 参数:缺省。
    • 返回值:返回父进程 id 号。

二、进程控制相关的函数

  1. kill 和 killall:用于发送信号给进程,以控制进程的行为。
    • kill -2 PID:发送信号给指定 PID 的进程,默认接收者关闭。
    • killall -9 进程名:发送信号给指定进程名对应的所有进程。

一、进程退出相关函数

  1. exit(int status)

    • 功能:让进程退出,并刷新缓冲区。会执行 I/O 库的清理工作,关闭所有的流以及所有打开的文件,执行清理函数(atexit)。
    • 参数:status 为进程退出的状态。
    • 返回值:缺省。
    • 常用退出状态:EXIT_SUCCESS(0)表示正常结束;EXIT_FAILURE(1)表示异常结束。
  2. _exit(int status)

    • 功能:让进程退出,不刷新缓冲区。
    • 参数:status 为进程退出状态。
    • 返回值:缺省。
  3. atexit(void (*function)(void))

    • 功能:注册进程退出前执行的函数。
    • 参数:function 为函数指针,指向 void 返回值、void 参数的函数指针。
    • 返回值:成功返回 0,失败返回非 0。当程序调用 exit 或者由 main 函数执行 return 时,所有用 atexit 注册的退出函数,将会由注册时顺序倒序被调用。

二、进程资源回收相关函数

  1. pid_t wait(int *status)

    • 功能:该函数可以阻塞等待任意子进程退出,并回收该进程的状态。一般用于父进程回收子进程状态。
    • 参数:status 为进程退出时候的状态,如果不关心其退出状态一般用 NULL 表示;如果要回收进程退出状态,则用 WEXITSTATUS 回收。
    • 返回值:成功回收的子进程 pid,失败返回 -1。
  2. 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 函数族)

  1. int execl(const char *path, const char *arg,...):以路径名作为参数,需要将参数一个一个列出,并以 NULL 结尾。
  2. int execv(const char *path, char *const argv[]):以路径名作为参数,需要构造一个参数指针数组,然后将数组的地址传入。
  3. int execle(const char *path, const char *arg,..., char *const envp[]):以路径名作为参数,可传入一个指向环境字符串的指针数组的指针,其他未指定环境变量,使用父进程继承过来的。
  4. int execve(const char *path, char *const argv[], char *const envp[]):真正的系统调用,以路径名作为参数,可传入环境变量指针数组,参数传递方式与 execv 相同。
  5. int execlp(const char *file, const char *arg,...):以文件名做参数,当 filename 中含有 / 时视为路径名,否则按 PATH 变量在指定目录下查找可执行文件,参数传递方式与 execl 相同。
  6. int execvp(const char *file, char *const argv[]):以文件名做参数,参数传递方式与 execv 相同。

这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错则返回 -1。

四、其他函数

  1. int system(const char *command)
    • 功能:使用该函数可以将 shell 命令直接在代码中执行。
    • 参数:command 要执行的 shell 命令。
    • 返回值:成功返回 0,失败返回 -1。

一、线程创建相关函数

  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,失败返回错误码。
  2. pthread_t pthread_self(void)

    • 功能:获取当前线程的线程 ID。
    • 参数:无。
    • 返回值:成功返回当前线程的线程 ID,失败返回 -1。

二、线程退出相关函数

  1. void pthread_exit(void *retval)

    • 功能:子线程自行退出。
    • 参数:retval为线程退出时候的返回状态,临死遗言。
    • 返回值:无。
  2. int pthread_cancel(pthread_t thread)

    • 功能:请求结束一个线程。
    • 参数:thread为请求结束的线程 ID。
    • 返回值:成功返回 0,失败返回 -1。

三、线程回收相关函数

int pthread_join(pthread_t thread, void **retval)

  • 功能:将指定的线程资源回收,具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。
  • 参数:thread为要回收的子线程 ID;retval为要回收的子线程返回值 / 状态。
  • 返回值:成功返回 0,失败返回 -1。

四、线程属性设置相关函数

  1. int pthread_attr_init(pthread_attr_t *attr)

    • 功能:初始化一个 attr的变量。
    • 参数:attr为需要变量来接受初始值。
    • 返回值:成功返回 0,非 0 表示错误。
  2. int pthread_attr_destroy(pthread_attr_t *attr)

    • 功能:销毁 attr变量。
    • 参数:attr为属性变量。
    • 返回值:成功返回 0,非 0 表示错误。
  3. int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)

    • 功能:把一个线程设置成相应的属性。
    • 参数:attr为属性变量,由 pthread_attr_init函数初始化;detachstate有两个可选值,PTHREAD_CREATE_DETACHED设置分离属性。
  4. int pthread_detach(pthread_t thread)

    • 功能:设置分离属性。
    • 参数:线程 ID。

五、线程清理相关函数

  1. void pthread_cleanup_push(void (*routine)(void *), void *arg)

    • 功能:注册一个线程清理函数。
    • 参数:routine为线程清理函数的入口;arg为清理函数的参数。
    • 返回值:无。
  2. void pthread_cleanup_pop(int execute)

    • 功能:调用清理函数。
    • 参数:execute为非 0 时执行清理函数,为 0 时不执行。
    • 返回值:无。

一、线程互斥相关函数

  1. int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)

    • 功能:将已经定义好的互斥锁初始化。
    • 参数:mutex为要初始化的互斥锁;attr为初始化的值,一般是 NULL表示默认锁。
    • 返回值:成功返回 0,失败返回非零。
  2. int pthread_mutex_lock(pthread_mutex_t *mutex)

    • 功能:用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程 / 线程都不能操作该部分代码,如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞。
    • 参数:mutex用来给代码加锁的互斥锁。
    • 返回值:成功返回 0,失败返回非零。
  3. int pthread_mutex_unlock(pthread_mutex_t *mutex)

    • 功能:将指定的互斥锁解锁,解锁之后代码不再排他访问,一般加锁解锁同时出现。
    • 参数:用来解锁的互斥锁。
    • 返回值:成功返回 0,失败返回非零。
  4. int pthread_mutex_destroy(pthread_mutex_t *mutex)

    • 功能:使用互斥锁完毕后需要销毁互斥锁。
    • 参数:mutex要销毁的互斥锁。
    • 返回值:成功返回 0,失败返回非零。
  5. int pthread_mutex_trylock(pthread_mutex_t *mutex)

    • 功能:类似加锁函数效果,唯一区别就是不阻塞。
    • 参数:mutex用来加锁的互斥锁。
    • 返回值:成功返回 0,失败返回非零或 E_AGAIN

二、线程同步(信号量)相关函数

  1. int sem_init(sem_t *sem, int pshared, unsigned int value)

    • 功能:将已经定义好的信号量赋值。
    • 参数:sem为要初始化的信号量;pshared = 0表示线程间使用信号量,!=0表示进程间使用信号量;value信号量的初始值,一般无名信号量都是二值信号量,0 表示红灯,进程暂停阻塞,1 表示绿灯,进程可以通过执行。
    • 返回值:成功返回 0,失败返回 -1。
  2. int sem_wait(sem_t *sem)

    • 功能:判断当前 sem信号量是否有资源可用。如果 sem有资源(==1),则申请该资源,程序继续运行;如果 sem没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并继续运行程序。注意:sem申请资源后会自动执行 sem = sem - 1
    • 参数:sem要判断的信号量资源。
    • 返回值:成功返回 0,失败返回 -1。
  3. int sem_post(sem_t *sem)

    • 功能:函数可以将指定的 sem信号量资源释放,并默认执行 sem = sem + 1,线程在该函数上不会阻塞。
    • 参数:sem要释放资源的信号量。
    • 返回值:成功返回 0,失败返回 -1。
  4. int sem_destroy(sem_t *sem)

    • 功能:使用完毕将指定的信号量销毁。
    • 参数:sem要销毁的信号量。
    • 返回值:成功返回 0,失败返回 -1。

一、无名管道相关函数

  1. int pipe(int pipefd[2])
    • 功能:创建并打开一个无名管道。
    • 参数:pipefd[0]为无名管道的固定读端;pipefd[1]为无名管道的固定写端。
    • 返回值:成功返回 0,失败返回 -1。

二、有名管道相关函数

  1. int mkfifo(const char *pathname, mode_t mode)

    • 功能:在指定的 pathname路径 + 名称下创建一个权限为 mode的有名管道文件。
    • 参数:pathname要创建的有名管道路径 + 名称;mode为 8 进制文件权限。
    • 返回值:成功返回 0,失败返回 -1。
  2. int unlink(const char *pathname)

    • 功能:将指定的 pathname管道文件卸载,同时从文件系统中删除。
    • 参数:pathname要卸载的有名管道。
    • 返回值:成功返回 0,失败返回 -1。

三、信号发送相关函数

  1. int kill(pid_t pid, int sig)

    • 功能:给 pid进程发送信号为 sig的系统信号(1/64)。
    • 参数:pid为要接收信号的进程 pidsig为当前程序要发送的信号编号。
    • 返回值:成功返回 0,失败返回 -1。
  2. int raise(int sig):等同于 kill(getpid(), int sig),给进程自己发送 sig信号。

  3. unsigned int alarm(unsigned int seconds):定时由系统给当前进程发送信号,也称为闹钟函数。

  4. int pause(void):进程暂停,不再继续执行,除非收到其他信号。

四、信号接收相关函数

sighandler_t signal(int signum, sighandler_t handler)

  • 功能:注册信号处理函数。
  • 参数:signum为要处理的信号编号;handler为信号处理方式,可以是 SIG_DFL(默认处理)、SIG_IGN(忽略处理)或自定义函数指针。
  • 返回值:成功返回上一次注册的信号处理函数指针,失败返回 SIG_ERR

一、共享内存相关函数

  1. key_t ftok(const char *pathname, int proj_id)

    • 功能:通过该函数可以将 pathname指定的路径用来以 proj_id生成唯一的临时键值。
    • 参数:pathname为路径 + 名称(任意文件,只要不会被删除重建即可);proj_id为整形的数字,一般用 ASCII 码的单字符表示与参数 1 的运算。
    • 返回值:成功返回唯一键值,失败返回 -1。
  2. int shmget(key_t key, size_t size, int shmflg)

    • 功能:使用唯一键值 key向内核提出共享内存使用申请。
    • 参数:key为唯一键值;size为要申请的共享内存大小;shmflg为申请的共享内存访问权限,八进制表示,如果是第一个申请,则用 IPC_CREAT,如果要检测是否存在,用 IPC_EXCL
    • 返回值:成功返回共享内存 id(一般用 shmid表示),失败返回 -1。
  3. void *shmat(int shmid, const void *shmaddr, int shmflg)

    • 功能:将指定 shmid对应的共享内存映射到本地内存。
    • 参数:shmid为要映射的本地内存;shmaddr为本地可用的地址,如果不确定则用 NULL,表示由系统自动分配;shmflg为 0 表示读写,SHM_RDONLY表示只读。
    • 返回值:成功返回映射的地址(一般等于 shmaddr),失败返回 (void*)-1
  4. int shmdt(const void *shmaddr)

    • 功能:将本地内存与共享内存断开映射关系。
    • 参数:shmaddr为要断开的映射地址。
    • 返回值:成功返回 0,失败返回 -1。
  5. int shmctl(int shmid, int cmd, struct shmid_ds *buf)

    • 功能:修改共享内存属性,也可以删除指定的共享内存对象。
    • 参数:shmid为要删除的共享内存对象;cmd为 IPC_RMID(删除对象的宏);buf为 NULL表示只删除对象。
    • 返回值:成功返回 0,失败返回 -1。

二、信号量集相关函数

  1. int semget(key_t key, int nsems, int semflg)

    • 功能:通过唯一键值向内核提出信号量申请。
    • 参数:key为唯一键值;nsems为要申请的信号量个数;semflg为申请的信号量的访问权限。
    • 返回值:成功返回 semid,失败返回 -1。
  2. int semop(int semid, struct sembuf *sops, unsigned nsops)

    • 功能:修改指定信号量集中信号量的值。
    • 参数:semid为信号量集 idsops为结构体指针,结构体成员包括信号量集中信号量的编号(sem_num)、信号量的 PV操作(sem_op,-1 表示 P操作,1 表示 V操作,0 表示阻塞)、信号量的操作方式(sem_flg,0 表示默认阻塞,IPC_NOWAIT和 SEM_UNDO为可选标志);nsops为信号量的设置值个数。
    • 返回值:成功返回 0,失败返回 -1。
  3. int semctl(int semid, int semnum, int cmd,...)

    • 功能:根据 semid删除指定的信号量集。
    • 参数:semid为要删除的信号量集;semnum为要删除的信号量集中的信号量的编号;cmd为 IPC_RMID(删除对象宏);可变长参数可以不写。
    • 返回值:成功返回 0,失败返回 -1。


http://www.kler.cn/a/291929.html

相关文章:

  • C语言剖析:srand()/rand()/time()
  • vue3点击按钮el-dialog对话框不显示问题
  • Rewar Model的输出(不包含训练)
  • Oracle Instant Client 23.5安装配置完整教程
  • xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer
  • Electron 沙盒模式与预加载脚本:保障桌面应用安全的关键机制
  • 基于微信小程序的挂号管理系统-web管理端
  • 酒店预约小程序搭建,让酒店更加智能化
  • SQLite 创建表:一场数据库里的“造物运动”
  • controlnet reference only
  • 微信小程序:如何在实现页面之间的返回
  • 一篇文章带你走进测试工程师的世界
  • C++ 中的const关键字
  • 前端框架vue3中的条件渲染(v-show,v-if,v-else-if,v-else)
  • Linux——网络(5)
  • 9.3 k8s介绍
  • 【高等代数笔记】(14-17)N阶行列式
  • Spring启动流程
  • 【C-实践】一对一的网络通信(tcp+select)
  • 在Python中,文本查找和替换的常用操作
  • 鸿蒙(API 12 Beta6版)【ArkGraphics 3D场景搭建以及管理】方舟3D图形
  • 如何打造基于Java SpringBoot和Vue的医院门诊智能预约平台?四步实现高效就医流程,整合MySQL数据库,优化用户体验。
  • 【实战篇】Mcu配置
  • 【js】数组去重
  • Day-04-QFile打开文件的两种方式
  • 计算机毕业设计 | SpringBoot+vue问卷调查系统 社会调研平台(附源码)