- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
武汉大学计算机科学技术操作系统实验报告
操作系统实验报告课题名称:操作系统实验学号:姓名:班号:2016年11月实习一 进程创建一、实习内容利用 fork()系统调用创建进程。二、实习目的了解进程的创建过程,进一步理解进程的概念,明确进程和程序的区别。三、实习题目编制一段程序,使用系统调用 fork( )创建两个子进程,这样在此程序运行时,在系统中就有一个父进程和两个子进程在活动。每一个进程在屏幕上显示一个字符,其中父进程显示字符 A,子进程分别显示字符 B 和字符 C。试观察、记录并分析屏幕上进程调度的情况。[提示]:(1)可用 fork()系统调用来创建一个新进程。系统调用格式:pid=fork()fork()返回值意义如下:=0:在子进程中,表示当前进程是子进程。0:在父进程中,返回值为子进程的 id 值(唯一标识号)。-1:创建失败。如果 fork()调用成功,它向父进程返回子进程的pid,并向子进程返回 0,即 fork()被调用了一次,但返回了两次。此时 OS 在内存中建立一个新进程,所建的新进程是调用 fork()进程的副本,称为子进程。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。(2)编译和执行的方法:gcc源文件名 -o 执行文件名最后,在 shell 提示符下输入: ./执行文件名就可执行该文件。四、实验步骤实验环境为Ubuntu16.04LTS64位,编译器为gcc 5.3.0。代码如下:#include?stdio.h??#include?stdlib.h??#include?unistd.h??#include?sys/wait.h????int?main()??{??????printf(Parent?Process,?PID?=?%d\n,?getpid());?// 通过getpid()获取进程号????pid_t?p1?=?fork();??????if?(p1??0)??//?fork返回负数,fork失败????{??????????printf(Error?occurred?while?forking\n);??????????exit(1);??????}??????else?if?(p1?==?0)???//?fork返回0,子进程1,显示自己的进程号,父进程号,B。????{??????????printf(Child?Process?1,?PID?=?%d,?PPID?=?%d,?B\n,?getpid(),?getppid());??//?getppid()返回其父进程的进程号????????return?0;??//?第一个子进程结束,不执行下面的操作????}??????pid_t?p2?=?fork();??// 原进程再次fork????if?(p2??0)??????{??????????printf(Error?occurred?while?forking\n);??????????exit(2);??????}??????else?if?(p2?==?0)???//?第二个子进程,显示自己的进程号,父进程号,C????{??????????printf(Child?Process?2,?PID?=?%d,?PPID?=?%d,?C\n,?getpid(),?getppid());??????????return?0;??????}??????waitpid(p1,?NULL,?0);??????waitpid(p2,?NULL,?0);//?父进程等待子进程结束,结束后下一行输出A????printf(This?is?Parent?Process,?as?its?PID?=?%d,?A.\n,?getpid());????return?0;}代码编写完成,保存为main1.c,执行gcc main1.c -o main1,在当前目录生成名为main1的可执行文件,终端输入./main1并回车,查看结果。五、实验结果多次执行main1,结果如图所示:六、结果分析从运行结果可以看出,显示B、C的是与显示A的进程不同的两个进程(PID不同),而一开始显示Parent Process的进程和最后显示A的进程是同一个(PID相同)。显示B、C的进程都是显示A的进程fork出来的,原因是因为它们的父进程的PID就是显示A的进程的PID。可以看出两个子进程是并行执行互不影响的,因为有时显示B在前,有时显示C在前,而父进程由于使用了waitpid函数,在两个子进程都结束后才显示A。waitpid()的第一个参数表示父进程正在等待的子进程的PID,这也说明了fork()返回给父进程的值是子进程的PID。七、实验心得这次实验让我了解了Linux系统函数fork()的用法,并对
您可能关注的文档
- 最新电大《小学数教学研究》形考作业任务01-05网考试题及答案.doc
- 最新电大《小学语文教学研》机考网考纸考题库及答案.doc
- 最新电大《小学语文教学研究》形考作业任务01-05网考题及答案.doc
- 最新电大《市管理学》任务1-4网考试题及答案.doc
- 最新电大《广告心理学》形考作业任务01-06网考题及答案.doc
- 最新电大《广告策划》形考作业任务01-05网试题及答案.doc
- 最新电大《广告美学》教学考一体化网考考作业试题及答案.doc
- 最新电大《广告运作流程》教学考一化网考形考作业试题及答案.doc
- 最新电大《府经济学》形考作业任务01-05网考试题及答案.doc
- 最新电大《建筑制图》考试题及答案.doc
文档评论(0)