操作系统原理A实验报告
学生姓名: 陶浩 学 号:1708090122 实验名称:实验3 进程的创建与控制(2) 实验指导教师: 葛艳
班级:惠普测试171
(二)进程的控制
一、实验目的
? 1. 掌握在子进程中使用execl()执行系统命令或调用已编译的其他可执行程序。 ? 2. 掌握父进程通过创建子进程完成某项任务的方法。 ? 3. 掌握系统调用exit()和_exit()的使用。
二、实验内容
1.运行程序exit1.c(p32页),把运行结果截图。再把_exit(0)换为exit(0),运行程序,把运行结果截图。 (1)分析修改前后运行结果出现的差异。(2)分析exit(0)和_exit(0)的区别。
2.先编译运行下面的hello.c程序,然后在编译运行程序exec.c,把运行结果截图。分析为什么子进程的最后两条语句(用红颜色标注)没有输出。 hello.c
#include
{ printf(“In hello.c, ID=%d\\n”,getpid()); printf(“hello\\n\ } exec.c
#include
{ printf(\ wait(0); }
else
{ printf(“In child, ID=%d\\n”,getpid()); printf(\ execl(\ perror(\ printf(\ } }
三、实验步骤及运行结果分析
1.运行程序exit1.c(p32页),把运行结果截图。
再把_exit(0)换为exit(0),运行程序,把运行结果截图。
(1)分析修改前后运行结果出现的差异。 当为_exit(0)的时候,运行结果为: this is parent1this is parent2 this is parent1this is child first
当为exit(0)的时候,运行结果为: this is parent1this is parent2 this is parent1this is child first this is child second
第二个运行结果比较第一个运行结果,多了一行:this is child second (2)分析exit(0)和_exit(0)的区别。
_exit()和exit()主要区别是一个直接结束进程进入内核中,一个退出进程会清理I/O缓冲区。
分析this is parent1出现了两次,问题是因为printf是有数据缓冲区的,采用的是I/O的方式,不加\\n数据不刷新,fork()创建子进程,复制了父进程的数据段和堆栈段,包括缓冲区。遇到\\n换行符自动从缓冲区将记录读出。
exit()将缓冲区中的数据写完才能退出来,所以会输出this is child second。而调用_exit()函数后程序直接退出到内核中。
2.先编译运行下面的hello.c程序,然后在编译运行程序exec.c,把运行结果截图。分析为什么子进程的最后两条语句(用红颜色标注)没有输出。
编译运行程序exec.c
分析:
execl()函数用来执行参数字符串所代表的文件路径。
perror()函数是将一个函数发生的错误原因输出到标准设备stderr(无缓冲,会直接输出)。
通常execl函数会放在fork()函数的子进程中,来代替子进程执行,执行成功后子进程就会消失,但是执行失败的话,必须用exit()函数让子进程退出。
execl(“./hello”,”hello”,NULL);子进程执行这句代码没有错误,下面的语句不会再执行。execl函数会取代执行它的进程,也就是说一旦execl函数执行成功,它就不会返回了,进程结束,不继续执行后面的代码。但是如果execl函数执行失败,它会返回失败的信息,而且进程继续执行后面的代码。
惠普测试171+实验3进程的创建与控制实验(2)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)