2022年操作系统进程管理 .pdf

上传人:H****o 文档编号:39720443 上传时间:2022-09-07 格式:PDF 页数:19 大小:685.49KB
返回 下载 相关 举报
2022年操作系统进程管理 .pdf_第1页
第1页 / 共19页
2022年操作系统进程管理 .pdf_第2页
第2页 / 共19页
点击查看更多>>
资源描述

《2022年操作系统进程管理 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统进程管理 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、深 圳 大 学 实 验 报 告课程名称:操作系统实验项目名称:进程管理学院:计算机与软件学院专业:软件工程指导教师:报告人:学号:班级:实验时间:实验报告提交时间:教务处制名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 19 页 -一、实验目的与要求:实验目的:通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序之间的区别。实验要求:1、掌握在 Windows 中编程,在CYGWIN 中编译运行的方法2、阅读例程,理解函数fork()、execl()、exit()、getpid()和 waitpid()的功能和用法3、运行例程,分析例程中关键代码的功能,给

2、出运行结果并对运行结果进行分析说明。4、模仿例程,编写一段程序实现以下功能:a)父进程使用系统调用fork()创建两个子进程b)各个子进程显示和输出一些提示信息和自己的进程标识符。c)父进程显示自己的进程ID 和一些提示信息,然后调用 waitpid()等待多个子进程结束,并在子进程结束后显示输出提示信息表示程序结束。5、父进程创建多个(3 个以上)进程并发运行,控制好各个子进程输出自己的进程标识符和一些提示信息,对程序运行结果进行分析说明。观察各个子进程并发执行的顺序,输出结果是否与设想中的顺序不同,并分析原因。二、方法、步骤:(说明程序相关的算法原理或知识内容,程序设计的思路和方法,可以用

3、流程图表述,程序主要数据结构的设计、主要函数之间的调用关系等)方法:此次试验需要使用到创建子进程的函数fork(),必须分清父进程和子进程的区别和各自的运行条件。要使父进程创建两个子进程,须在父进程执行的代码中再次创建子进程。用到的函数:getpid()。execl()waitpid()getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。execl()用来执行参数path 字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv1,,最后一个参数必须用空指针(NULL)作结束。waitpid()会暂时停

4、止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码步骤:1 启动 VC+等开发平台,创建我们所需的程序文件并保存到CYGWIN 的用户文件夹下。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 19 页 -2.启动 CYGWIN,在命令行中输入ls,可看到我们存入的程序文件。在命令行中输入gcc o XXX.exe XXX.

5、cpp 把程序文件变成CYGWIN 下可行的文件。可知是否实现了可执行文件。3.在 CYGWIN 命令行下运行./XXX.(为之前带exe后缀的文件)名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 19 页 -结果在CYGWIN上会直接显示。三实验过程及内容:(对程序代码进行说明和分析,越详细越好,代码排版要整齐,可读性要高)第一个程序:Hello word:#include int main(void)printf(Hello World!n);return 0;Hello word 是我们最早接触的用C 语言编的语句。因为是用整形int 定义的 main,所以要有返回值,结尾

6、return 0;是给系统的一个信息,代表程序正常结束。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 19 页 -创建 2个子进程:#include#include#include#include#include#include#include int tprintf(const char*fmt,.);int main(void)int i=0,j=0;pid_t pid;printf(Hello from Parent Process,PID is%d.n,getpid();pid=fork();printf(process%d|My parent PID is%d.n,g

7、etpid(),getppid();sleep(1);if(pid=0)/子进程执行 sleep(1);for(i=0;i3;i+)printf(Hello from THE child process%d.%d timesn,getpid(),i+1);sleep(1);名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 19 页 -else if(pid!=-1)/父进程 tprintf(Parent forked one child process-%d.n,pid);pid=fork();printf(process%d|My parent PID is%d.n,getpid

8、(),getppid();sleep(1);if(pid=0)sleep(1);for(i=0;itm_hour,tstruct-tm_min,tstruct-tm_sec,getpid();va_start(args,fmt);return vprintf(fmt,args);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 19 页 -在父进程下创建子进程时,父进程与子进程各自独立执行。执行fork 调用,创建了一个新的进程,这个进程共享父进程的数据和堆栈空间等,这之后的代码指令为子进程创建了一个拷贝。fock 调用是一个复制进程,fock 不象线程需提供一个函数做为入口,fo

9、ck调用后,新进程的入口就在fock 的下一条语句。子进程运行时的时候,并非调用和执行父进程的数据。子进程的数据和堆栈空间和父进程是独立的,而不是共享数据。运行截图实验 3:进程中调用外部命令:#include#include#include#include#include#include#include int tprintf(const char*fmt,.);int main(void)pid_t pid;pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(

10、5);tprintf(hello from child process!n);tprintf(I am calling exec.n);名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 19 页 -execl(/bin/ps,-a,NULL);tprintf(Y ou should never see this because the child is already gone.n);else if(pid!=-1)tprintf(Hello from Parent,pid%d.n,getpid();sleep(1);tprintf(Parent forked process%d.

11、n,pid);sleep(1);tprintf(Parent is waiting for child to exit.n);waitpid(pid,NULL,0);tprintf(Parent had exited.n);else tprintf(Everything was done without error.n);return 0;int tprintf(const char*fmt,.)va_list args;struct tm*tstruct;time_t tsec;tsec=time(NULL);tstruct=localtime(&tsec);printf(%02d:%02d

12、:%02d:%5d|,tstruct-tm_hour,tstruct-tm_min,tstruct-tm_sec,getpid();va_start(args,fmt);return vprintf(fmt,args);其中 execl()用来执行参数path 字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv1,,最后一个参数必须用空指针(NULL)作结束。此程序是调用LINUX/UNIX下的进程管理命令ps a,最后一个值必须为NULL。运行截图:名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 19 页 -创建多个子进程:#include#

13、include#include#include#include#include#include int tprintf(const char*fmt,.);int main(void)int i=0,j=0;pid_t pid;printf(Hello from Parent Process,PID is%d.n,getpid();pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(1);for(i=0;i3;i+)printf(Hello from THE ch

14、ild process%d.%d timesn,getpid(),i+1);sleep(1);else if(pid!=-1)tprintf(Parent forked one child process-%d.n,pid);名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 19 页 -pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(1);for(i=0;i3;i+)printf(Hello from child process%d.%d time

15、sn,getpid(),i+1);sleep(1);else if(pid!=-1)tprintf(Parent forked one child process-%d.n,pid);pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(1);for(i=0;itm_hour,tstruct-tm_min,tstruct-tm_sec,getpid();va_start(args,fmt);return vprintf(fmt,args);运行截图:父进程创建多个子

16、进程并且子进程各自运行3 个外部调用命令:#include#include#include#include#include#include#include int tprintf(const char*fmt,.);int main(void)int i=0,j=0;pid_t pid;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 19 页 -printf(Hello from Parent Process,PID is%d.n,getpid();pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid

17、();sleep(1);if(pid=0)tprintf(I am calling exec.n);execl(/bin/ps,-a,NULL);sleep(1);else if(pid!=-1)tprintf(Parent forked one child process-%d.n,pid);pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(1);tprintf(I am calling exec.n);execl(/bin/ls,-l,NULL);sleep

18、(1);else if(pid!=-1)tprintf(Parent forked one child process-%d.n,pid);pid=fork();printf(process%d|My parent PID is%d.n,getpid(),getppid();sleep(1);if(pid=0)sleep(1);tprintf(I am calling exec.n);execl(/bin/uname,-a,NULL);sleep(1);else if(pid!=-1)tprintf(Hello from Parent,pid%d.n,getpid();sleep(1);tpr

19、intf(Parent forked process%d.n,pid);sleep(1);tprintf(Parent is waiting for child to exit.n);waitpid(pid,NULL,0);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 19 页 -tprintf(Parent had exited.n);else tprintf(everything was done whitout error.n);return 0;int tprintf(const char*fmt,.)va_list args;struct tm*tstruct;ti

20、me_t tsec;tsec=time(NULL);tstruct=localtime(&tsec);printf(%02d:%02d:%02d:%5d|,tstruct-tm_hour,tstruct-tm_min,tstruct-tm_sec,getpid();va_start(args,fmt);return vprintf(fmt,args);创建了第一个子进程后,子进程与父进程相继运行。子进程调用ps a时,父进程则创建第二个子进程。当ps a运行结束,父进程与第二个子进程相继运行。因为第二个子进程代码最开始sleep(1);停止了 1s才运行 tprintf(I am callin

21、g exec.n);所以父进程运行,并创建了第三个子进程;此时第二个子进程与第三个子进程运行,输出 uname a(查看当前电脑所有状态信息)和 ls l,当子进程结束,父进程也随之结束。运行结果如下:名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 19 页 -名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 19 页 -四、实验结论:(提供运行结果,对结果进行探讨、分析、评价,并提出结论性意见和改进想法)实验一:Hello world!实验二:创建双子进程:实验三:调用外部命令:tprintf(Y ou should never see this because

22、 the child is already gone.n);和tprintf(Everything was done without error.n);并无编译。第一句是因为子进程在运行了ps a 的时候已经结束了,第二句是因为else条件不满足。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 19 页 -创建多个子进程:3 个子进程3 次调用外部命令:名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 19 页 -五、实验体会:(根据自己情况填写)通过这一次的实验让我了解了一些Linux 系统指令操作和进程管理,但这一次的实验虽然通过实验书的指导做出来了,但有一些指令还是不是很清楚,通过以后的实验我相信一定能真正搞懂这些指令的实质。名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 19 页 -注:“指导教师批阅意见”栏请单独放置一页名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 19 页 -指导教师批阅意见:成绩评定:指导教师签字:年月日备注:名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 19 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁