实验二:进程控制
16281259 鲁鑫
- 打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。
1)首先在/tmp临时文件夹下使用vi命令编辑
2)使用ps -ef|grep <进程名/进程号>可以查看进程的PID以及PPID
如下图:
可以看到vi t1.c进程的进程号为3069,父进程号为3060
接着查找进程号为3060的进程的PID和PPID
进程号为3060的进程名为bash,父进程号为3050
进程号为3050的进程名为 /usr/lib/gnome-terminal/gnome-terminal-server,父进程号为1424
进程号为1424的进程名为/lib/systend/systend –user,父进程号为1
进程号为1的进程名为/sbin/init splash
进程树为/sbin/init splash——>
/lib/systend/systend –user——>
/usr/lib/gnome-terminal/gnome-terminal-server——>
bash——>vi t1.c
使用pstree命令查看进程树,如下图:
可以看到进程树与ps命令寻找的进程树相符合 - 编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。
代码如下:
使用ps -Al命令查看vi进程的PID以及PPID:
使用ps aux命令可以查看进程的具体信息
au(x) 输出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
vi进程的具体信息:
父进程的具体信息:
使用top命令查看cpu的占用率:
- 使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t p,p2,p3,p4,p5;
while((p=fork())==-1);
if(!p)
{
while((p2=fork())==-1);
if(!p2)
{
printf("进程P4的pid为%d,父进程为p2,id为%d\n",getpid(),getppid());
}
else if(p2>0)
{
printf("进程p2的pid为%d,父进程为p,id为%d\n",getpid(),getppid());
}
while((p2=fork())==-1);
if(!p2)
{
printf("进程p5的pid为%d,父进程为p2,id为%d\n",getpid(),getppid());
}
else
{
;
}
}
else if(p>0)
{
printf("进程p为父进程,id为%d,它的父进程id为%d\n",getpid(),getppid());
}
while((p=fork())==-1);
if(!p)
{
printf("进程p3的id为%d,父进程为p,id为%d\n",getpid(),getppid());
}
else
{
;
}
return 0;
}
运行结果截图:
可以看到进程p1的pid为2816,p2的pid为2817,p3的pid为2818,p4的pid为2819,p5的pid为2820。
4.修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。
循环输出运行结果:
终止p2进程:
github代码库