说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Linux网络编程》、《linux系统编程》
一、进程的相关概念
详细请看:概念篇——进程的概念认识
(1) 进程引入的原因:实现资源共享和程序并发执行
(2) 程序与进程的概念:程序不是进程,进程是处于执行状态的程序及相关资源的总称
(3) 进程的组成:程序段、数据段、PCB
(4) 进程的标识符:PID
(5) 进程之间的关系:(层次结构:进程树
(6) 进程的基本状态:新建、就绪、执行、阻塞、退出
(7) 特殊进程名:僵死进程、鬼魂进程、孤儿进程、守护进程。
(8) 进程间通信(IPC):管道、消息队列、信号量数组、共享内存
(9)进程组与会话 :进程组——进程的集合,会话——进程组的集合。
(10)进程与线程的关系:一个进程中可拥有至少一个线程。
二、获取进程标识符
详细请看:【Linux】函数简介篇——获取进程相关ID函数
相关API:
(1) getpid()
:获取调用进程的进程ID
(2) getppid()
:获取调用进程的父进程的进程ID
(3) getuid()
:获取调用进程的实际用户ID
(4) geteuid()
:获取调用进程的有效用户ID
(5)getgid()
:取调用进程的实际组ID
(6) getegid()
:取调用进程的有效组ID
(7) getpgrp()
:获取调用进程的进程组ID,即领头进程的PID
(8) getpgid()
:获取指定进程pid的进程组ID.
三、进程的产生
(1)进程的产生过程:
(1) 首先复制其父进程的环境配置。
(2) 在内核中建立进程结构。
(3) 将结构插入到进程列表,便于维护。
(4) 分配资源给此进程。
(5) 复制父进程的内存映射信息。
(6) 管理文件描述符和链接点。
(7) 通知父进程。
(2)相关API:【表示如何创建新进程】
1️⃣fork ()
、vfork()
:创建新进程。
详细请看:【Linux】函数简介篇——进程的创建函数:fork()、vfork()
2️⃣system()
:调用“/bin/sh-c command
”执行特定命令,阻塞当前进程直到command命令执行完毕。【包含运行】
详细请看:【Linux】函数简介篇——进程的创建函数:system()
四、进程的运行
详细请看:【Linux】函数简介篇——进程的运行:exec()系列函数
(1)相关API:【表示进程中如何将新执行文件载入地址空间】
exec()系列
:读取可执行文件并载入地址空间开始运行,该序列函数完成相同功能,但参数构造不同。
1️⃣execl()
:执行PATH,所有参数在PATH之后,直到一个NULL指针和环境从’environment’
2️⃣execlp()
:执行FILE,搜索’ PATH’环境变量,如果它不包含斜杠,所有参数在FILE后面,直到一个NULL指针和环境从’environment’
3️⃣execle()
:执行PATH,所有参数都在PATH后面,直到一个NULL指针,之后的参数用于环境
4️⃣execv()
:从’ environ’执行带有参数ARGV和environment的PATH。
5️⃣execvp()
:执行FILE,搜索’ PATH’环境变量,如果它不包含斜杠,参数ARGV和环境从’ environment ’
6️⃣execve ()
:替换当前进程,使用参数ARGV和环境ENVP执行PATH。ARGV和ENVP以NULL指针结束
(2)函数名的解读:
(1)l 表示参数以列表方式提供。
(2)v 表示参数以数组[向量]方式提供。
(3)p 表示用户在PATH环境变量中寻找可执行文件。
(4)e 表示会提供给新进程以新的环境变量。
PS:
可使用fork()
与exec()系列
搭配,完成运行可执行程序的新进程。
五、进程的同步
详细请看:【Linux】函数简介篇——进程同步函数
多个进程之间需要写作完成任务时,经常发生业务之间的依赖现象,从而出现了进程的同步问题。
Linux下进程的同步方式主要有消息、信号量等。
信号量是一个共享的表示数量的值。用于多个进程之间操作或者共享资源的保护,它是进程之间同步的最主要方式。
(1)相关API:【表示进程的层次关系,父进程如何收集后代信息】
1️⃣wait()
:等待进程.提供初级的进程同步措施,能使一个进程等待,直到另一个进程结束为止,常用于获取(释放)僵死子进程的信息。
2️⃣waitpid()
:等待特定进程。
3️⃣waitid()
:等待特定进程(更多选项)。
4️⃣sleep()
:进程休眠。
六、进程的终止
(1)终止方式:(①~⑤正常终止, ⑥~⑧异常终止, ⑨~⑩设置终止调用函数)
① return
语句:从main()
返回。
② exit()
函数:执行一些基本的终止进程步骤后,通知内核终止这个进程
③ _exit() 或_Exit()
函数:用STATUS的低阶8位终止程序执行(无需运行终止处理程序或信号处理程序而终止的方法)
④最后线程从其启动例程返回:线程返回值不会作为进程返回值,进程返回值为0
⑤最后线程调用pthread_exit()
函数:与上一个一样,进程返回值为0
⑥ abort()
函数:进程异常终止.(产生SIGABRT
信号)
⑦ 接收信号终止:
⑧最后线程对取消请求作出响应:
⑨ atexit()
函数:结束调用回调函数(原型:void function(void);
)
⑩ on_exit()
函数:结束调用回调函数(原型:int function(int status, void *arg);
)
(2)相关API:【表示进程的消亡】
详细请看:【Linux】函数简介篇——进程终止函数
①exit()
——执行清理工作后,通知内核关闭进程。
②_Exit()
——立即通知内核关闭进程。
③_exit()
——立即通知内核关闭进程。
④atexit()
——进程结束调用终止处理程序。(一参)
⑤on_exit()
——进程结束调用终止处理程序。(两参)
⑥abort()
——异常终止
七、进程的通信
详细请看:进程篇——进程间通信(IPC)汇总
Linux下多进程间的通信机制叫做IPC,是多个进程间进行相互沟通的一种方式。
进程之间的通信有多种方式,如:
1. 管道
利用内核在两个进程之间建立通道,特点是与文件的操作类似,仅在管道的-一端只读,另一端只写,利用读写的方式在进程之间传递数据。
2. 消息队列
内核地址空间中的内部链表,每个消息队列可用IPC标识符唯一的进行标识,不同的消息队列之间是相对独立的。每个消息队列中的消息,又构成一个独立的链表。
3.信号量数组
一种计数器,用来控制对多个进程共享的资源所进行的访问。
4.共享内存
将内存中的一段地址,在多个进程之间共享。多个进程利用获得的共享内存的地址来直接对内存进行操作。