操作系统 实验二:进程控制

本文介绍了一个进程控制实验,展示了如何使用ps命令找到特定进程及其父进程,直至init进程,并比较了两种方式得到的进程树。同时,还介绍了如何利用fork和exec创建及控制进程,以及如何观察进程状态的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验二:进程控制

16281259 鲁鑫

  1. 打开一个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命令寻找的进程树相符合
  2. 编写程序,首先使用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的占用率:
    在这里插入图片描述
  3. 使用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代码库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值