文章目录
前言
以下主要对进程控制的一些场景进行了简单的描述,主要包含写时拷贝,进程终止(退出),进程等待,进程替换。
一、写时拷贝
父进程在调用fork函数创建一个子进程之后,子进程是拷贝了父进程的PCB,因此子进程PCB与父进程的PCB是一样的。而PCB中有一个内存指针,它指向了程序地址空间的首地址。这个程序地址空间,实际上是进程虚拟地址空间,它当中保存的地址,并不是数据真实在内存中的地址,而是一个虚拟地址。操作系统通过页表(分页式或分段式或段页式)结构来管理虚拟地址和真实地址之间的映射关系,即操作系统能通过页表找到真实地址。
写时拷贝:当父进程创建子进程之后,父子进程通过页表结构映射到同一块物理内存,当父子进程对当前这块物理内存都不进行修改的时候,他们之间的映射关系是一直不变的,当要进行修改的时候,才拷贝各自一份副本。
写时拷贝属于深拷贝,开辟了新空间。
二、进程终止
1.进程的退出场景
①代码运行完毕,结果正确
②代码运行完毕,结果不正确
③代码异常终止
2.常见的退出方法
①main函数的return返回(正常退出)
②exit函数
exit函数是一个库函数,包含在3号手册。exit函数谁调用谁退出。
③_exit函数
_exit函数是一个系统调用函数,包含在2号手册。_exit函数也是谁调用谁退出。
_exit函数与exit函数区别:exit函数内部封装了_exit函数,exit函数要比_exit函数多做两件事1.刷新缓冲区。2.执行用户自定义的清理函数。
补充:atexit函数(回调函数)
atexit函数参数为函数指针类型,需要接收函数的地址。使用atexit函数传递的函数为回调函数,是用atexit注册了一个函数,这个函数是在main函数结束之后才会调用。
④ctrl+c:结束一个前台进程
4.刷新缓冲区的方法:
①main函数的return返回
②fflush强制刷新
③\n
④exit函数
三、进程等待
1.进程等待的作用:
父进程调用进程等待方法,等待子进程的退出,防止子进程变成僵尸进程。
2.进程等待函数wait
wait函数的参数是一个输出型参数,他的作用是等待子进程退出
重点:如果子进程没有退出,wait函数就会阻塞,(即在返回调用结果之前,该线程会挂起)一直等到子进程退出才会继续向下执行代码。
其中,参数 stat_loc是一个指针,占4个字节,它是把wait函数内部计算的结果通过参数 stat_loc返回给调用者.
细看*stat_loc如下
3.waitpid函数
参数分析 :
①pid:
pid = -1表示等待任意一个子进程,与wait等效
pid > 0表示等待其进程ID与pid相等的子进程(等待指定的子进程)
②*stat_loc:与wait函数的参数一样
③options:
0:表示阻塞模式
WNOHANG:表示非阻塞模式
四、进程程序替换
1.进程程序替换原理
进程程序替换,就是替换正在运行的程序,让当前的程序区运行其他程序。
替换之后,只是讲进程虚拟地址空间当中的数据段和代码段替换位新的程序,并且更新堆栈。注意:进程替换完毕之后,进程的进程号pid不会改变。
2.进程替换函数:exec函数簇
1.execl
参数分析:
*path:表示待要替换的可执行程序,需要指定可执行程序的路径。
arg:给可执行程序传递的命令行参数。
注意:给arg传递的第一个参数必须是可执行程序本身,且可变参数列表也是传递给可执行程序的参数,需要以NULL结尾。
…:可变参数列表。
例如:
程序的执行结果:
execl函数返回值:
如果替换成功,则执行替换后的程序,没有返回值,替换失败,返回-1
2.execlp
参数分析:
*file:表示待要替换的可执行程序,可以不用给路径,但这个待要替换的程序必须在PATH环境变量中能搜索的到
arg和… 表示的含义同execl
例如:
3.execle
参数分析:
*path,arg和… 表示的含义同execlp
envp[]:表示程序员需要自己组织环境变量
4.execv
参数分析:
*path:表示待要替换的可执行程序,需要指定可执行程序的路径。
argv[]:一个指针数组,保存给可执行程序传递的参数,argv[]的第一个必须是可执行程序本身,最后一个元素要以NULL结尾
5.execvp
参数分析:
*file:同execlp
argv[]同execv
6.execve
*file:同execlp
argv[]同execv
envp[]:表示程序员需要自己组织环境变量
7.总结
1.函数名中带有p,表示会自动搜索环境变量,函数名中没有p,则不会自动搜索环境变量
2.函数名中带有e,表示程序员需要自己组织环境变量,函数名中没有e,则程序员不用自己组织环境变量
3.exec函数簇中,只有execve函数是系统调用函数,其他都属于库函数
3.进程程序替换应用场景
1.bash:
bash的工作流程:bash先创建一个子进程,让子进程进行进程程序替换,替换为程序员输入的命令
2.守护进程:
守护进程的作用是为了保护业务进程。
在启动业务进程的时候,不是直接启动业务程序,而是启动一个守护进程,让守护进程创建一个子进程,并让子进程进行进程程序替换替换为业务程序进程。由守护进程和业务进程进行通信,告知业务进程的情况:①业务进程正常,守护进程不做处理②业务进程异常,则由守护进程创建一个子进程,让子进程进行进程程序替换。