《计算机操作系统》 实验二 进程控制

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源代码

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值