- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大连民族大学
计算机科学与工程学院
《操作系统》课程实验报告
实验题目: 实验二 进程的创建
实验类型:□演示性 □验证性 ■操作性 □设计性 □综合性
专业:网络工程 班级:163班
学生姓名:** 学号:*888888
实验日期:2018年 4月3日
实验地点:I305
实验学时:4
实验成绩:
指导教师签字: 2018年 5月10日
【实验目的】:
(1)掌握进程的概念,明确进程的含义
(2)认识并了解进程的并发执行
(3)掌握进程的创建
(4)掌握进程另外的创建方法exec系列
【实验内容】:
1、阅读实例代码fork1, 并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释。
2、阅读实例代码fork2, 并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释。
3、阅读实例代码fork3, 查阅调用exec( )用新的程序替换该子进程的内容,掌握在程序中运行一个操作系统命令的方法,尝试给出合理的解释。
4、修改fork3, 使之能把运行的命令和程序作为参数传给fork3
5、写实验报告
附:实验代码
Fork1.c
#includestdio.h
#includeunistd.h
main( )
{ int pid;
pid=fork();
if (pid==-1)
{printf(“fork failed.\n”);
return;
}
printf(“I’m the child.\n”);
printf(“I’m the parent.\n”);
return;
}
Fork2.c
#include stdio.h
main( )
{
int p1,p2,i;
while((p1=fork( ))= = -1); /*创建子进程p1*/
if (p1= =0)
for(i=0;i10;i++)
printf(daughter %d\n,i);
else
{ while((p2=fork( ))= = -1); /*创建子进程p2*/
if(p2= =0)
for(i=0;i10;i++)
printf(son %d\n,i);
else
for(i=0;i10;i++)
printf(parent %d\n,i);
}
}
Fork3.c
#includestdio.h
includeunistd.h
main()
{ int pid;
pid=fork();
if(pid==0) {
printf(“I’m the child.\n”);
execl(“/bin/ls”,”ls”,0);
perror(“exec error.\n”);
} else if(pid0)
printf(“I’m the parent.\n”)
else printf(“fork failed.\n”);
printf(“program end.\n”);
}
【运行结果】:
Fork1.c运行结果截图
Fock2.c运行结果截图
Fock3.c运行结果截图
【分析原因】:
(1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child. I’m the parent. 第二次,执行父进程的时候,返回的是子进程的进程号pid 0,即pid的值仍然不为-1,所以又输出了一次I’m the child. I’m the parent。
(2)对于程序2:由于进程并发执行的调度顺序和父子进程抢占处理机的问题,输出字符的顺序和先后随着执行的不同而发生变化。
(3)对于程序3:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid 0,所以输出I’m the parent. Program end. 当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child. 并调用了execl()函数,查看了指定路径中的文件。
【总结】:
调试过程中遇到的问题及解决过程
运行程序3的时候如果不接execl函数的头文件unistd.h会提示警告,而且因为execl的第三个参数是字符型指针数组,所以要强制转换成指针型。
文档评论(0)