实验二 进程控制

1、打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。

pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行;xargs能够捕获一个命令的输出,然后传递给另外一个命令。通过两个命令的配合,完成了显示名字为vi的进程的输出,并通过ps命令一步一步找到父进程。
在这里插入图片描述
通过pstree命令得到以下的进程树:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比对两种方法获得的父进程,发现均为systemd→lightdm→upstart→gnome-terminal→bash→vi。其中,systemd是一组系统管理命令,取代了init命令成为系统的第一个进程;LightDM即Light Display Manager,是一个全新的、轻量的Linux桌面的桌面显示管理器;有趣的是,upstart是一种基于事件通知机制启动相应服务的init进程,即较早版本的Ubuntu的初始化进程为init→upstart;gnome-terminal为终端的管理进程;bash是其中一套shell规范(类似于Ubuntu和Linux的关系),而shell是一套linux接口。

2、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。

#F代表程序的旗标(flag),4代表使用者为 superuser,1代表user;

#S代表这个程序的状态 (STAT);

#UID代表执行者身份;

#PID代表进程的ID号

#PPID代表父进程的ID;

#C代表使用的CPU资源百分比;

#PRI代表进程的执行优先权(Priority的简写),其值越小越早被执行;

#NI代表进程的nice值,其表示进程可被执行的优先级的修正数值;

#ADDR代表内核函数;

#SZ表示占用内存的大小;

#WCHAN表示这个程序是否正在运作当中,其中’ -’表示正在运作;

#TTY表示登入者的终端机位置;

#TIME表示使用掉的 CPU 时间;

#CMD 表示下达指令的名称;

编写程序如下在这里插入图片描述
运行程序
在这里插入图片描述
在这里插入图片描述
找到vi进程
在这里插入图片描述
使用 ps aux查看内存中运行的程序
在这里插入图片描述
使用top命令 可以发现 编写的循环程序几乎占用所有的cpu
在这里插入图片描述
3、使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。
在这里插入图片描述
编写程序如下

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include<sys/types.h>

int main(int argc, char *argv[])
{
  pid_t P1,P2,P3,P4;
  P1 = fork(); //创建P1子进程
  if(P1<0)
   perror ("fork");
  else if(P1 == 0)
 {
   printf("进程P2,PID是%d,PPID是%d\n",getpid(),getppid());
   P3 = fork();
   if(P3<0)
    perror ("fork");
   else if(P3 == 0)
 {
   printf("进程P4,PID是%d,PPID是%d\n",getpid(),getppid());
 }

  else if(P3 > 0){
  wait(NULL);
    P4 = fork();
    if(P4<0)
    perror ("fork");
    else if(P4 == 0)
  {
   printf("进程P5,PID是%d,PPID是%d\n",getpid(),getppid());
  }
  else wait(NULL);
 }

 }
 else if(P1 > 0)
 {
   printf("进程P1,PID是%d,PPID是%d\n",getpid(),getppid());wait(NULL);
   P2 = fork();
   if(P2<0)
    perror ("fork");
   else if(P2 == 0)
    printf("进程P3,PID是%d,PPID是%d\n",getpid(),getppid());
  else wait(NULL);

 }
return 0;
}

运行
在这里插入图片描述
4.修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。

由于需要循环输出自己的ID和父进程的ID,所以程序逻辑发生变化,重新编写程序并运行如下。5个程序并发执行,前后并无固定的顺序,但是进程ID及其父进程ID始终满足题目进程树的要求。
在这里插入图片描述
在这里插入图片描述
github:https://github.com/EricChen1124/OS

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值