《操作系统实验报告--实验三 一个进程启动另一个程序的执行.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告--实验三 一个进程启动另一个程序的执行.docx(17页珍藏版)》请在优知文库上搜索。
1、操作系统实验报告专业:物联网工程实验三一个进程启动另一个程序的执行【实验目的】在Linux环境系统中,execve系统调用用于执行一个程序(可执行二进制文件或脚本)。exec函数家族,包括execRexeclpexecleexecvexecvp,是execve系统调用的前端。本实验要求学生学习在一个进程中启动另一个程序执行的基本方法,了解execve系统调用和exec函数家族的使用方法。【实验内容】(一)初步认识“在一个进程中启动另一个程序的执行:1编辑一个源程序dummy.c,并编译为可执行程序dummy。/dummy.c#include#include#include#includeint
2、main(intargc,char*argv)(intresult;printf(nYouarenowinarunningprogram%s.n,argv0);printf(,MyPIDis%d.MyparentsPIDis%d.n,getpid(),getppid();printf(nPleaseinputaninteger(0-255),whichwillbereturnedtomyparentprocessn);scanf(%dn,&result);printf(,Goodbye.nnu);return(result&0377);)2、再编辑一个源程序exec_test.c,并编译为可执
3、行程序exec_testo/exec_test.c#include#include#include#include#include#includeintmain(intargc,char*argv)(intresult;result=fork();if(result0)(perror(Failedtocreatechild*);exit(l);)elseif(result=0)/Child1char*cmd=./dummy;printf(Chidprocess,sPIDis%d.MyparentsPIDis%d.n,getpid(),getppid();printf(,Childprocess
4、isabouttoexecute%s,nn,cmd);result=execlp(cmd,cmd,NULL);if(result=-1)(perror(Inchildprocess,failedtoexecaprogram*);)exit(0);)else(/parentintstatus;printf(nParentprocesssPIDis%d.n,getpid();printf(nParentprocessiswaiting.n);wait(&status);printf(nInparentprocess,status=0x%x,WEXITSTATUS(status)=%d(i.e.0x
5、%x)nu,status,WExiTSTATUS(Status),WEXITSTATUS(status);)return(EXIT.SUCCESS);)3、先执行dummy,观察、分析执行结果;然后执行程序exec_test,观察、分析执行结果。(注意,两个可执行程序都在当前目录下)(二)实现一个简单的命令解释外壳(Shell)o1基本功能:(1)从标准输入读取一行字符串,其中包含欲执行的命令和它的命令行参数(如果有的话)。提示:需要将输入的一行字符串进行拆分,以空格、制表符(t)作为分隔符,分解为命令、命令行参数(零个或多个)。如果用户输入的命令是“quit”,则退出执行。(2)创建一个子进
6、程。(3)在子进程中,执行在(1)读入的命令,如果有命令行参数,也要传递。(4)在父进程中,等待子进程结束,然后打印子进程的返回值。(5)在父进程中,控制转移至(I)o【实验要求】按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。【实验设计】dummy程序:HIiyuxin221liyuxin221test3$./dummyHyouarenowinarunningprogram./dummy. MyPIDis14758.MyparentsPIDis14449.HPleaseinputaninteger(-255),whichwillbereturned
7、tomyparentprocess.233 Goodbye.I,lyg11221QlIyUXln221test33结果显示了该进程的PID和父进程的PID,并且将一个值返回给了父进程。exec_testSJ?5:Inparentprocess,status=2a0,WEXITSTATUS(status)=42(i.e.x2a)Iiyuxin221liyuxin221test3S./exectest.outParentprocesssPIDis14769.ParentprocessiswaitingChildprocesssPIDis1477.MyparentsPIDis14769.Childp
8、rocessisabouttoexecute./dummyYouarenowinarunningprogram./dummy.MyPIDis14770.MyparentsPIDis14769.Pleaseinputaninteger(-255),whichwillbereturnedtomyparentprocess:19Goodbye.Inparentprocess,status=0x13,WEXITSTATUS(status)=19(i.e.13)Iiyuxin221(aiiyuxin221test3S在子进程中键入的数值返回了父进程,并显示了出来(19).实现一个简单的命令解释外壳(Sh
9、ell)源代码:/example#include#include#include#include#include#include#includeintmain()intpid;intrtn;子进程的返回值intexec_errorno;charcommand256;char*p;char*q;char*c20;inti=0,j=0;while(l)/从终端读取要执行的命令printf();command0=,0,;p=fgets(command,256,stdin);if(p=NULL)perror(Errorinfgets().n);exit(-l);)/Deletethelastchar(
10、newline)inthestringreturnedbyfgets()Commandfstrlen(Command)-1=,0,;p=command;q=p;/Quitifuserinputsquitif(!strcmp(command,quit,)break;)/Createachildprocesstoexecutecommandpid=fork();if(pidO)perror(HFailedwhilecallingfork.*);exit(-l);1elseif(pid=0)子进程执行此命令for(;)ci=strtok(p,M,);if(ci=NULL)break;1i+;p=NU
11、LL;)p=c0;for(j=0;jquitIiyuxin221liyuxi221 test3 fial2.outls -alIs -al 总用量152 dxrwxr-x dnxnxr-x -xrwxr-x -rwxrwxr-x -rwxn-n- -rwxrwxr-x -nxn-rw- rwxrwxr-x -xn-n- -nxrfxr-x -nxn-n- -rwxnxr-x -nxn-n- -rwxrwxr-x -rwxn-rv- rwxrwxr-x -rwxr-xr-x -nxrwxr-x -xnn -rwxrw-n- -rwxnxr-x -rwxn-n- -nxrw-rw-2 51 111
12、1111 11111111 11111Uyuxin221 liyuxin221 liyuxi221 liyui221 liyin221 Uyuxin221 liyuxin221 Uyuxin221 liyuxin221 liyuxi221 liyuxin221 liyui221 liyin221 Xiyuxin221 Uyuxin221 Uyuxin221 liyuxin221 liyuxin221 liyuxi221 liyin221 liyuin221 liyuxin221 liyuin221liyuxin221 liyuxin221 liyuxi221 liyuxin221 liyuxin221 liyuxin221 Uyuxin221 liyuxin221 liyuxin221 liyuxin221 liyuxi221 liyuxin221 liyuxin221 liyuxin221 Uyuxin221 liyuxin221 liyuxin221 liyuxin2