1. 打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。
(1)输入vi,打开一个新进程
(2)打开另一个终端,使用ps命令
- 输入ps –A命令,查看所有进程的ID,如下图可看到第一步打开的vi编译器的id是3080
- 输入ps –ef|grep 3080,查看进程vi的详细信息
可以看到vi的PID=3080 PPID=2868
- 寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID,使用ps –ef|grep XXX命令搜索其父进程,直到进程号为1
可以看到搜索父进程顺序为:3080->2868->2859->1744->1
- 使用pstree命令的得到进程树,比对后一致
2. 编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。
代码如下:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
void main()
{
pid_t pid;
pid = fork();
if(pid>0)
while(1);
else if(!pid)
{
int ret;
ret = execl("/usr/bin/vi","vi","/home/mjw/hooks.txt",NULL);
if(ret==-1)
printf("excel");
}
else if(pid==-1)
printf("fork");
}
运行过程:
使用ps-ai
ps-aux
Top命令排序
3. 使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t p1,p2,p3,p4,p5;
while((p1=fork())==-1);
if(p1>0)
{
printf("p1的pid是%d,ppid是%d\n", getpid(),getppid());
printf("p3的pid是%d,ppid是%d\n",p1,getpid());
while((p2=fork())==-1);
if(p2>0)
{
printf("p2的pid是%d,ppid是%d\n", p2,getpid());
}
if(p2==0)
{
while((p4=fork())==-1);
if(p4>0)
{
printf("p4的pid是%d,ppid是%d\n", p4,getpid());
while((p5=fork())==-1);
if(p5>0)
{
printf("p5的pid是%d,ppid是%d\n", p5,getpid());
}
}
}
}
}
运行结果如下:
4. 修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。
代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t p1,p2,p3,p4,p5;
while((p1=fork())==-1);
if(p1>0)
{
while((p2=fork())==-1);
{
if(p2==0)
{
while((p5=fork())==-1);
{
if(p5>0)
{
while((p4=fork())==-1);
{
if(p4==0)
{
while(1)
{
printf("p4的pid是%d,ppid是%d\n",getpid(),getppid());
}
}
else if(p4>0)
{
while(1)
{
printf("p2的pid是%d,ppid是%d\n",getpid(),getppid());
}
}
}
}
else if(p5==0)
{
while(1)
{
printf("p5的pid是%d,ppid是%d\n",getpid(),getppid());
}
}
}
//使用exit(0)退出程序
//exit(0);
}
else if(p2>0)
{
while(1)
{
printf("p1的pid是%d,ppid是%d\n",getpid(),getppid());
}
}
}
}
else if(p1==0)
{
while(1)
{
printf("p3的pid是%d.ppid是%d\n",getpid(),getppid());
}
}
}
运行结果:
进程循环输出自己的ID和父进程的ID:
可以看到:
| Pid | Ppid |
P1 | 4401 | 4356 |
P2 | 4403 | 4401 |
P3 | 4402 | 4401 |
P4 | 4405 | 4403 |
P5 | 4404 | 4403 |
使用ps-A
(1)查找及KILL-9 4403
(2)调用exit(0)终止进程P2
源代码:实验二-GitHub源代码