操作系统进程管理_第1页
操作系统进程管理_第2页
操作系统进程管理_第3页
操作系统进程管理_第4页
操作系统进程管理_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深 圳 大 学 实 验 报 告课程名称:操作系统实验项目名称:进程管理学院:计算机与软件学院专业:软件工程指导教师:报告人:学号:班级:实验时间:实验报告提交时间:教务处制一、实验目的与要求:实验目的:通过进程的创建、 撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序之间的区别。实验要求:1、 掌握在 windows 中编程,在cygwin 中编译运行的方法2、 阅读例程,理解函数fork() 、execl()、exit()、 getpid()和 waitpid() 的功能和用法3、 运行例程,分析例程中关键代码的功能,给出运行结果并对运行结果进行分析说明。4、 模仿例程,编写一段

2、程序实现以下功能: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. 启动 cygwin , 在命令行中输入ls, 可看到我们存入的程序文件。在命令行中输入gcc o xxx.exe xxx.cpp 把程序文件变成cygwin 下可行的文件。可知是否实现了可执行文

5、件。3.在 cygwin 命令行下运行 ./xxx. (为之前带exe后缀的文件)结果在cygwin上会直接显示。三实验过程及内容:(对程序代码进行说明和分析,越详细越好,代码排版要整齐,可读性要高) 第一个程序:hello word:#include int main(void) printf(hello world!n); return 0; hello word 是我们最早接触的用c 语言编的语句。 因为是用整形int 定义的 main,所以要有返回值,结尾return 0;是给系统的一个信息,代表程序正常结束。创建 2个子进程:#include #include #include #i

6、nclude #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 f

7、rom the child process %d.%d timesn,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_sta

8、rt(args,fmt); return vprintf(fmt,args); 在父进程下创建子进程时,父进程与子进程各自独立执行。执行fork 调用,创建了一个新的进程,这个进程共享父进程的数据和堆栈空间等,这之后的代码指令为子进程创建了一个拷贝。fock 调用是一个复制进程,fock 不象线程需提供一个函数做为入口,fock调用后,新进程的入口就在fock 的下一条语句。子进程运行时的时候,并非调用和执行父进程的数据。子进程的数据和堆栈空间和父进程是独立的,而不是共享数据。运行截图实验 3:进程中调用外部命令:#include #include #include #include #inc

9、lude #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(5); tprintf(hello from child process!n); tprintf(i am calling exec.n); execl(/bin/ps,-a,null); tprintf(y ou should never

10、 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.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 do

11、ne 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:%02d:%5d|,tstruct-tm_hour,tstruct-tm_min,tstruct-tm_sec,getpid(); va_start(args,fmt); return vprintf(fmt,args); 其中 execl()用来执行参数

12、path 字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0) 、argv1, ,最后一个参数必须用空指针(null) 作结束。此程序是调用linux/unix下的进程管理命令ps a,最后一个值必须为null 。运行截图:创建多个子进程:#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,p

13、id 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 child process %d.%d timesn,getpid(),i+1); sleep(1); else if(pid!=-1) tprintf(parent forked one child process-%d.n,pid); pid=fork(); printf

14、(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 timesn,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(

15、),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); 运行截图:父进程创建多个子进程并且子进程各自运行3 个外部调用命令:#include #include #include #include #include #include #include int tprintf (const char*fmt,.); int main(void) int i=0,j=

16、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) 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=f

17、ork(); 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(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(),getppi

18、d(); 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); tprintf(parent forked process %d.n,pid); sleep(1); tprintf(parent is waiting for child to exit.n); waitpid(pid,null,0); tprint

19、f(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; time_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); 创建了第一个子进程后,子进程与父进程相继运行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论