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

2024-09-02 07:52

本文主要是介绍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。

这篇关于Linux 进程与线程相关函数及进程间通信方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129415

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验