操作系统实验报告--实验三 一个进程启动另一个程序的执行.docx
《操作系统实验报告--实验三 一个进程启动另一个程序的执行.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 liyuxi
13、n221 liyuxin221 Uyuxin221 liyuxin221 liyuxin221 liyuxin221 liyuxi221 liyuxin221 liyuxin221 liyuxin221 Uyuxin221 liyuxin221 liyuxin221 liyuxin221 liyuxi221 liyuxin221liyuxi221 Uyuxin221 Uyuxin221496 496 5364 5364452 5238 1624 6354l 474892 5986 1619 6333 1647635 6333 647 19283l 4965418 5652IG月 1月 l月 1
14、月 1月 l月 l月 Ie月 Ie月 IG月 Ie月 Ie月 1月 l月 l月 IG月 1。月 1月 1。月1月 1月 10月 11月23 10:45 .2 20:35 .2 21:34 dummy23 10:43 dummy32 21:34 dummy.C2 21:03 dummy.out23 10:24 example.c23 10:25 example.out21 20:58 execl.c21 20:58 execl.out2 20:54 exec test.c2 20:54 exec test.out23 18:22 finall.c23 10:22 finall.out23 16:
15、42 final2.c23 10:42 final2.out16 19:57 gnome - te rminal. desktop21 20:48 shell21 20:47 shell.c23 10:45 Strtokl.C23 10:45 StrtOkl-OUt21 21:24 strtok.c6 212 text3【收获及体会】实验指导书在实验调试和分析的过程中,我越来越懂得自学能力和自我独立解决问题的重要性。在以后的实验和学习中,我会不断的加强对这方面的训练。【参考资料】实验指导书实验五线程间的互斥与同步【实验目的】理解POSlX线程(Pthread)互斥锁和POSlX信号量机制,学习
16、它们的使用方法;编写程序,实现多个POSIX线程的同步控制。【实验内容】创建4个POSIX线程。其中2个线程(A和B)分别从2个数据文件(datal.txt和data2.txt)读取10个整数.线程A和B把从文件中读取的逐一整数放入一个缓冲池.缓冲池由n个缓冲区构成(n=5,并可以方便地调整为其他值),每个缓冲区可以存放一个整数。另外2个线程,C和D,各从缓冲池读取10数据。线程C、D每读出2个数据,分别求出它们的和或乘积,并打印输出。提示:(1)在创建4个线程当中,A和B是生产者,负责从文件读取数据到公共的缓冲区,C和D是消费者,从缓冲区读取数据然后作不同的计算(加和乘运算)。使用互斥锁和信
17、号量控制这些线程的同步。不限制线程C和D从缓冲区得到的数据来自哪个文件。(2)在生产者线程中,确保从文件读出数据以后,再去“生产二在开始设计和实现之前,务必认真阅读下列内容:课本6.8.4节;讲义(课堂PPT)中关于“生产者.消费者问题”的部分;课本第6章后面的编程项目一一生产者-消费者问题。【实验要求】按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。【实验设计】#include#include#include#include#inciude#defineNUMTHREADS5intbuffer5;intin=O;写入标识intout=0;读取标识p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统实验报告-实验三 一个进程启动另一个程序的执行 操作系统 实验 报告 一个 进程 启动 另一个 程序 执行

链接地址:https://www.desk33.com/p-850895.html