16281035-操作系统实验2

该博客详细介绍了Linux操作系统中的进程控制实验,包括使用fork创建进程,exec调用vi编辑器,通过ps命令查找进程及其父进程,理解进程状态以及使用kill命令终止进程。实验旨在深化对进程概念、区别于程序的理解,并熟悉Linux命令的使用。
摘要由CSDN通过智能技术生成

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

16281035
我的github网址,里面有源文件,请查看

实验目的

  • 加深对进程概念的理解,明确进程和程序的区别。
  • 掌握Linux系统中的进程创建,管理和删除等操作。
  • 熟悉使用Linux下的命令和工具,如man, find, grep, whereis, ps, pgrep, kill, ptree, top, vim, gcc,gdb, 管道|等。

基础知识

  • 进程的创建

Linux中,载入内存并执行程序映像的操作与创建一个新进程的操作是分离的。将程序映像载入内存,并开始运行它,这个过程称为运行一个新的程序,相应的系统调用称为exec系统调用。而创建一个新的进程的系统调用是fork系统调用。

  • exec系统调用

#include <unistd.h>

int execl (const char *path, const char *arg,…);

execl()将path所指路径的映像载入内存,arg是它的第一个参数。参数可变长。参数列表必须以NULL结尾。

通常execl()不会返回。成功的调用会以跳到新的程序入口点作为结束。发生错误时,execl()返回-1,并设置errno值。

例 编辑/home/kidd/hooks.txt:

int ret;

ret = execl (”/bin/vi”, ”vi”,”/home/kidd/hooks.txt”, NULL);

if (ret == -1)

perror (”execl”);

  • fork****系统调用

#include <sys/types.h>

#include <unistd.h>

pid_t fork (void);

成功调用fork()会创建一个新的进程,它与调用fork()的进程大致相同。发生错误时,fork()返回-1,并设置errno值。

例:

pid_t pid;

pid = fork ();

if (pid > 0)

printf (”I am the parent of pid=%d!\n”, pid);

else if (!pid)

printf (”I am the baby!\n”);

else if (pid == -1)

perror (”fork”);

  • 终止进程

exit()系统调用:

#include <stdlib.h>

void exit (int status);

  • 进程挂起

pause() 系统调用:

int pause( void );

函数pause会把进程挂起,直到接收到信号。在信号接收后,进程会从pause函数中退出,继续运行。

  • wait(等待子进程中断或结束)

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait (int * status);

wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。

如果在调用 wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。

子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。

如果不在意结束状态值,则参数status可以设成 NULL。

VIM常用命令速查

在这里插入图片描述

实验题目

1. 打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。
  1. 首先我先自己创建一个名为VI的vim文件,之后用vim打开
    1552704979565

  2. 打开界面如下:
    我在其中启用了编辑命令,编辑了以下内容:
    1552705009838

  3. 保存
    1552705098963

  4. 查看vim进程号,5065

    ![1552705140843](https://img-blog.csdnimg.cn/20190316114007384.png
    在这里插入图片描述

  5. 寻找vim进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    init进程的pid是1.

    init进程是其他所有进程的父进程.

    列出父进程号是1的进程,就是列出除了init外的所有进程.

    所以寻找vim的父进程如下:

    ​ 5065 -> 4626 -> 4619 -> 908 -> 1

  6. 将得到的进程树和由pstree命令的得到的进程树进行比较。

在这里插入图片描述

在这里插入图片描述
两个相比较,是一样的结果: 5065 -> 4626 -> 4619 -> 908 -> 1

2、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值