操作系统原理A实验报告学生姓名:陶浩学号:1708090122班级:惠普测试171实验名称:实验3进程的创建与控制(2)实验指导教师:葛艳(二)进程的控制一、实验目的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#includestdio.hmain(){printf(“Inhello.c,ID=%d\n”,getpid());printf(“hello\n);}exec.c#includeunistd.h#includestdio.h#includeerrno.hmain(){intp;p=fork();if(p0){printf(Intheparent\n);wait(0);}else{printf(“Inchild,ID=%d\n”,getpid());printf(beforeexecuteexecl\n);execl(./hello,hello,NULL);perror(execlfailedtorunhello);printf(afterexecuteexecl\n);}}三、实验步骤及运行结果分析1.运行程序exit1.c(p32页),把运行结果截图。再把_exit(0)换为exit(0),运行程序,把运行结果截图。(1)分析修改前后运行结果出现的差异。当为_exit(0)的时候,运行结果为:thisisparent1thisisparent2thisisparent1thisischildfirst当为exit(0)的时候,运行结果为:thisisparent1thisisparent2thisisparent1thisischildfirstthisischildsecond第二个运行结果比较第一个运行结果,多了一行:thisischildsecond(2)分析exit(0)和_exit(0)的区别。_exit()和exit()主要区别是一个直接结束进程进入内核中,一个退出进程会清理I/O缓冲区。分析thisisparent1出现了两次,问题是因为printf是有数据缓冲区的,采用的是I/O的方式,不加\n数据不刷新,fork()创建子进程,复制了父进程的数据段和堆栈段,包括缓冲区。遇到\n换行符自动从缓冲区将记录读出。exit()将缓冲区中的数据写完才能退出来,所以会输出thisischildsecond。而调用_exit()函数后程序直接退出到内核中。2.先编译运行下面的hello.c程序,然后在编译运行程序exec.c,把运行结果截图。分析为什么子进程的最后两条语句(用红颜色标注)没有输出。编译运行程序exec.c分析:execl()函数用来执行参数字符串所代表的文件路径。perror()函数是将一个函数发生的错误原因输出到标准设备stderr(无缓冲,会直接输出)。通常execl函数会放在fork()函数的子进程中,来代替子进程执行,执行成功后子进程就会消失,但是执行失败的话,必须用exit()函数让子进程退出。execl(“./hello”,”hello”,NULL);子进程执行这句代码没有错误,下面的语句不会再执行。execl函数会取代执行它的进程,也就是说一旦execl函数执行成功,它就不会返回了,进程结束,不继续执行后面的代码。但是如果execl函数执行失败,它会返回失败的信息,而且进程继续执行后面的代码。