- 1、打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。
实验步骤:
- 使用PS命令查询父进程
使用ps -ef|grep vi 查找vi进程,得知为2870号
Ps-ef显示所有进程号
所有进程的ID和父进程ID为:2870->2859->2209->1509->1091->937->1
pstree查询命令进程树
找寻2870
可以看到,可以看到 我们得到的进程树结果是一样的
- 2、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。
(一)熟悉fork函数使用操作:
调用fork函数,系统会将代码复制,并新建一个进程继续往下执行,会产生两个返回值,若返回值为-1,则说明创建子进程失败,若返回值为0,则进入子进程,若返回值是一个大于0的数,则此部分为主进程,这个大于0的数为子进程的进程号
(二)程序编写:
实验要求子进程打开vi编辑器,主进程实现空循环。
子进程通过execl函数调用vi命令打开编辑器
主进程用空循环来起到保持程序运行状态的作用
ps-a命令显示的结果为正确执行结果,子进程打开了vi编辑器,主进程依旧在执行
- 查看每个进程的状态及cpu占用
终端输入top可以看到,改命令将主机中的所有进程全部动态显示了出来,并且按照cpu使用率进行了排序,主进程cpu占用率为98.3%,状态为R,是执行状态,下面的s状态是休眠状态
- 3、使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。
P1为此代码执行的主进程,产生2个子进程P2,P3,在P2进程中,再fork创建两个子进程P4,P5
程序运行结果如下:
可以看出
由执行结果可知,p1进程的pid号为7706;
p2进程的pid号为7707,父进程的pid号为7706,即p1;
p3进程的pid号为7708,父进程的pid号为7706,即p1;
p4的pid号为7709,父进程的pid号为7707,即p2;
p5的pid号为7710,父进程的pid号为7707,即p2;
- 4、修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。
执行程序后每个进程都循环输出自己的进程号和父进程号,如下图所示:
具体展示如下:
打开另一个终端,找到进程2的pid号7754,在另一个终端中输入kill -9 -7754,终止掉进程2
可以看出7754已经defunct状态
P2被kill掉
p2段代码修改为:
可以看到,p4、p5进程的父进程转为7833,在进程树上与p1进程是兄弟节点关系,同时p2进程被正常终止。
修改代码为:
github代码链接:
https://github.com/waguyu/waguyu/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9Flab2.docx