理论知识

Linux——进程管理

Linux——Linux C语言编程基础知识

手把手教你安装Linux虚拟机

一、实验目的

(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)分析进程争用资源的现象,学习解决进程互斥的方法。

二、实验内容

Liunx文件与目录操作

  • 显示文件目录命令ls
  • 改变当前目录命令cd
  • 建立子目录mkdir
  • 删除子目录命令rmdir
  • 删除文件命令rm
  • 文件改名命令mv
  • 文件复制命令cp
  • 显示文件的内容more或者less
  • 查找文件find
  • 重定向与管道 |

进程管理

运行以下附录部分中给出的程序,查看自己运行的结果,并进行分析。

1、写出程序的运行结果,并分析为什么会得到这样的结果。

2、画出程序执行的进程树并在相应的进程节点上标出进程号

编写程序,要求见附录部分

三、代码及运行结果分析

Liunx文件与目录操作

显示文件目录命令ls

改变当前目录命令cd

建立子目录mkdir

删除子目录命令rmdir

删除文件命令rm

文件改名命令mv

文件复制命令cp

显示文件的内容more或者less

查找文件find

重定向与管道 |

进程管理

(1)运行源码

运行上文进程管理中给出的例子,查看自己运行的结果,并进行分析。

程序1

程序2

程序3

程序4

程序5

程序6

程序7

(2)进程的创建

自己编写一段程序,使用系统调用fork()创建子进程,认识进程的并发执行。

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>int main(){pid_t pid;pid=fork();if(pid<0)       /* 如果出错 */printf("error occurred!\n");else if(pid==0) /* 如果是子进程 */{printf("我是子进程1,进程号是%d\n",getpid());pid_t pid1;pid1 = fork();if(pid1==0){printf("我是子进程1的子进程,进程号是%d\n",getpid());}}else{printf("我是父进程,进程号是%d\n",getpid());pid=fork();if(pid==0)printf("我是子进程2,进程号是%d\n",getpid());else{pid=fork();if(pid==0)printf("我是子进程3,进程号是%d\n",getpid());}}return 0;}

(3)进程的同步

自己编写一段程序,利用fork()、wait()等系统调用实现父子进程间的同步。

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2,i;while((p1=fork())==-1);if(p1==0){lockf(1,1,0);for(i=0;i<50000; i++)printf("son%d\n",i);lockf(1,0,0);}else{while((p2=fork())==-1);if(p2==0){lockf(1,1,0);for(i=0;i<50000;i++)printf("daughter%d\n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50000;i++)printf("parent%d\n",i);lockf(1,0,0);}}return 0;
}

(四个进程管理的程序)

程序1

#include "stdio.h"
main()
{int i,j,k;
if (i=fork())
{j=wait();
printf("Parent Process!\n");
printf("i=%d,j=%d,k=%d\n",i,j);
}
else
{k=getpid();
printf("Child Process!\n");
printf("i=%d,k=%d\n\n",i,k);
}
}

使用fork()的进程是父进程,通过fork()建立的新进程是子进程。

fork()创建成功,返回值对子进程是0,对父进程是子进程的pid(一个正整数)。

在调用fork()后,父进程和子进程均从下一条语句开始执行。

wait()的功能是阻塞父进程,等待子进程完成后使得父进程继续工作。

wait()的返回值是所等待的子进程的进程标识符。

getpid()返回调用进程的进程标识符,则输出子进程的k与父进程的i,j相等。

输出结果可能是:

Child Process!
i=0,k=9351
Parent Process!
i=9351,j=9351

程序2

#include <stdio.h>
main()
{
int p1,p2;
long i;
char c1;
while ((p1=fork())==-1);
if (p1==0)
{c1='B';write(1,&c1,1);for( i=0;i<3000000;i++) ;   c1='b';write(1,&c1,1);
}
else
{while ((p2=fork())==-1);if (p2==0){c1='C';write(1,&c1,1);for( i=0;i<3000000;i++) ;c1='c';write(1,&c1,1);}else{c1='A';write(1,&c1,1);for( i=0; i<3000000; i++) ;c1='a';write(1,&c1,1);}}
}

用fork()创建两个子进程,程序运行时,系统中有1个父进程和2个子进程活动。

每个进程在屏幕上显示两个字符,父进程显示“A”和“a”。

write(1,&c1,1)的函数原型write(fd,buf,count):从buf所指向的内存中输出count个字符的信息到fd所代表的文件中,fd为文件号,buf为一个地址,此处fd=1,代表的就是显示屏,从地址&c1处输出一个字符到屏幕上,就是显示出c1,在每一个进程代码中间都有循环语句起延时作用,能够看出进程调度的效果。

为何不使用printf,printf经过缓冲,使用后,“A”和“a”会一次显示出来,不会交错显示。

可能的输出结果:AbbCca,AaBbCc,ABCcba等等。

程序3

main()
{int m,n,k;
m=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",m);
printf("hee\n");
n=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",n);
printf("ha\n");
k=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",k);
printf("ho\n");
}

程序3的简化

main(){
fork();printf(“hee\n”);
fork();printf(“ha\n”);
fork();printf(“ho\n”);
}

为了便于观察,先打印出调用进程的进程标识符,而后是fork()的返回值。

若是

main(){
fork();printf(“hee\n”);
}

打印出

hee (父进程)hee (子进程)

请大家上机抄下结果,画出进程树,在每一个进程结点边上画出标识符。

程序4

#include <stdio.h>
main()
{
int i;
if (fork()==0){for(i=0;i<10000;i++)  printf(".......................\n");
}
else
{if (fork()==0){for( i=0; i<10000; i++)printf("#################\n");}else for (i=0;i<10000;i++)printf("******************\n");
}
}

程序4中也是3个进程。

程序5

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2;while((p1=fork())==-1);if(p1==0)printf("b.My process ID is %d\n",getpid());else{while((p2=fork())==-1);if(p2==0)printf("c.My process ID is %d\n",getpid());else printf("a.My process ID is %d\n",getpid());}return 0;
}

程序6

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{       int m,n,k;m=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",m);printf("he\n");n=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",n);printf("ha\n");k=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",k);printf("ho\n");return 0;
}

程序7

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2,i;while((p1=fork())==-1);if(p1==0)for(i=0;i<50000; i++)printf("son%d\n",i);else{while((p2=fork())==-1);if(p2==0)for(i=0;i<50000;i++)printf("daughter%d\n",i);elsefor(i=0;i<50000;i++)printf("parent%d\n",i);}return 0;
}

四、实验心得

(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)分析进程争用资源的现象,学习解决进程互斥的方法。

(4)复习课本关于进程控制和进程同步的内容,加深对进程管理概念的理解。

(5)认真阅读实验材料中进程管理部分,分析多个进程的运行情况。

参考文章

《操作系统》实验报告——进程管理

lockf函数的使用

《操作系统》实验报告——熟悉Linux基础命令及进程管理相关推荐

  1. 操作系统——实验壹——熟悉Linux基础命令及进程管理

    一. 实验目的 加深对进程概念的理解,明确进程和程序的区别. 进一步认识并发执行的实质. 分析进程争用资源的现象,学习解决进程互斥的方法. 二. 实验内容 运行程序,查看自己运行的结果,并进行分析. ...

  2. 【Linux】实验报告2 Linux基础命令

    作者|Rickyの水果摊 时间|2022年6月27日 文章目录 实验目的 实验原理 1.Linux文件系统 2.Linux存储位置 常用命令存放位置 头文件存放位置 3.Linux常用命令 路径 目录 ...

  3. linux killall 源代码,Linux基础命令---杀死进程killall

    killall killall可以根据名字来杀死进程,它会给指定名字的所有进程发送信息.如果没有指定信号名,则发送SIGTERM.信号可以通过名称(例如-HUP或-SIGHUP)或数字(例如-1)或选 ...

  4. Linux命令查看子进程命令,Linux基础命令——查看进程命令

    linux是一个 多进程   多用户的操作系统 ps(显示当前进程的状态) ps -ef  查看当前linux 进程 ps -ef | grep 'mysqld'  过滤mysql的进程 (grep  ...

  5. 操作系统实验报告linux进程管理,计算机操作系统实验报告三Linux进程基本管理.doc...

    GDOU-B-11-112广东海洋大学学生实验报告书(学生用表) GDOU-B-11-112 实验名称 Linux进程基本管理 课程名称 计算机操作系统 课程号 学院(系) 专业 统 班级 学生姓名 ...

  6. 四十一、Linux基础命令,用户管理和文件系统总结

    @Author: Runsen 这次内容是总结极客时间的Linux课程的知识点. 文章目录 基础命令 获取登录信息 查看自己使用的Shell 查看命令的说明和位置 清除屏幕上显示的内容 查看帮助文档 ...

  7. 《Linux基础》06. 进程管理 · 服务管理

    Linux基础-06 1:进程管理 1.1:查看进程 1.1.1:ps 1.1.2:pstree 1.1.3:top 1.2:终止进程 1.2.1:kill 1.2.2:killall 2:服务管理 ...

  8. linux命令作为子进程标记,Linux基础命令---显示进程ps

    ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,"ps-aux"与"ps ...

  9. linux select 进程id,Linux基础命令---显示进程ps

    ps ps指令可以显示系统中当前进程的信息,它的输出结果是高度可定制的.如果您希望重复更新所选内容和显示的信息,请使用top(1)代替. 请注意,"ps-aux"与"ps ...

最新文章

  1. 卷积神经网络(CNN)原理
  2. GARFIELD@07-08-2005 DILBERT
  3. 12月27日云栖精选夜读:实人认证 - 阿里云实人认证(公测)发布
  4. 完整议程、重磅嘉宾公布,第四范式AI新品发布会持续报名中
  5. 529. Minesweeper
  6. 实名羡慕,国内这些厂.NET薪资高的吓人!
  7. python访问k8s的api_python过滤 Kubernetes api数据
  8. java两种不同单例模式_关于Java里的两种单例模式
  9. resin端口错误问题
  10. JavaScript逻辑运算符
  11. 证明华为模拟器Wvrp5.2a的二三层可以通信的trunk实验
  12. 幸运的袋子(深度优先遍历(Depth First Search,DFS))
  13. GPS、RTK、PPK三种定位技术的原理及应用
  14. 遇到This application failed to start becauseit could not find...的问题
  15. linux安装eclipse教程,Linux下的Eclipse安装
  16. cmd命令跳舞代码_Golang语言元编程之代码生成
  17. 两步解决【zabbix】Time zone for PHP is not set (configuration parameter “date.timezone”)
  18. 压缩包修改所属目录Linux,LINUX 压缩、解压、打包文件 修改文件所属组
  19. Entity Framework入门
  20. cadence 旋转快捷键_cadence常用快捷键自己总结

热门文章

  1. day10 in india
  2. java转json jar包_java转换json需导入的jar包说明
  3. containers文件夹可以删除吗_电脑进行C盘清理,appdata文件夹可以删除吗?
  4. 西部服务器怎么备份文件,怎么将云服务器数据还原
  5. 计算机制图实训心得体会,绘图实训心得体会
  6. 获取java异常堆栈信息_Java 实例 - 获取异常的堆栈信息
  7. c语言如何定义比较大的数组_C语言:数据结构-数组的定义、逻辑结构和特点
  8. lookup函数和vlookup_LOOKUP函数与VLOOKUP函数,你总会喜欢一个的
  9. 七十四、滑动窗口最值问题
  10. 七十七、React中的propTypes,defaultProps和生命周期函数