该仓库包括关于Linux线程的知识点笔记,并且通过一个“多线程拷贝”的小Demo作为应用。
小DEmO的源文件及readme在子文件夹中。
该函数用于创建进程。
创建进程的继承与被创建的进程有亲缘关系。Linux系统中,除了init进程外都有父进程。
fork函数的执行过程:可以看作有三部分1、自进程的创建2、子进程的初始化+return3、return
fork函数的返回值:对父进程:在克隆阶段返回子进程PID。对子进程:在子进程中,fork 函数结束时返回0。创建失败返回-1.
子进程的执行范围:子进程中,从fork执行到末尾。
三个版本的fork函数:
1.父进程用户区完全拷贝给子进程,
2.vFork 子进程没有用户空间,结合exec函数使用
通过fork函数的返回值区分父子函数,
进程功能(用户区)重载。可以加载某个程序的用户层(功能),加入到一个进程中、
二次包裹:在系统函数的基础上,封装新的函数。
返回值:源程序的返回值代码已经被覆盖,返回值为重载函数的返回值

execl
参数:execl(“源程序的位置” ,“参数1",...,NULL);
函数执行:
execlp
p代表系统可以自行查找命令位置。不需要手动写
execv
使用数组进行传参。
execvp
不需要手动写命令的绝对位置,参数使用数组。
execve(系统函数)
e表示修改进程的环境的变量,使用新的进行覆盖
网站中的功能利用进程重载对应的用户区即可、不需要改变网站代码。

产生原因:子进程先于父进程结束,子进程用户层被回收,部分内核层回收,pcb被残留变成僵尸进程。
父进程可以回收僵尸进程,同时,可以通过残留的pcb进行验尸,提取子进程结束的原因。
危害:
- 内存泄漏,PCB未被回收,占用内存空间。pcb结构体有384个成员,某些成员还会额外申请内存,pcb指向的内存无法被使用。
- 系统中进程的创建取决于PCB数量,如果大量僵尸进程占用PCB,会影响进程创建,僵尸越多,可创建的进程越少。进程的数量是固定的。
回收:
Linux系统中,子进程的pcb回收只能由父进程回收。父进程了也可以使用pcb查看子进程死亡的原因。子进程是自行退出还是被杀死,父进程进行推出校验。
通过wait函数回收僵尸进程。具体如下:
wait(int* status);
阻塞回收函数,执行后进入等待,子进程结束后,唤醒该函数回收残留,然后返回,
int* status:用于接收回收pcb时子进程的退出原因,后序父进程可以通过status进行退出校验,如果不关心,传NULL
返回值:回收成功返回子进程PId,如果失败、没有子进程返回-1
wait_pid (pid_t pid, int * status, int opt);
pid_t pid : >0可以指定回收,-1 回收任意一个子进程,0 回收与父进程同组的一个子进程,<-1 指定回收某一个进程组的一个子进程
opt: WNOHANG 非阻塞回收的参数
返回值:>0回收成功 子进程ID, =0没有可回收的子进程,-1回收失败

