北京邮电大学北京邮电大学Unix编程环境课程第二次实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Unix编程环境上机二班级:学号:姓名:1.实验目的:联系使用系统调用函数hi线一个shell命令功能,进一步熟悉进程控制与进程通信。2.实验要求:使用fork(),exec(),dup2(),pipe(),open()系统调用完成与下列shell命令等价的功能。grep–vusr/etc/passwd|wc–lresult.txt3.实验过程:a)了解系统调用的使用:实验中用到了fork(),exec(),dup2(),pipe(),open(),wait()这几个系统调用i.fork()实验中fork()用来产生新的进程,处理“grep”和“wc”这两个命令调用。用fork()==0来判断这个进程是否是子进程,如果是子进程则在下面的代码中用exec来调用系统命令。ii.exec()实验中采用execlp()来执行“grep”和“wc”命令。在调用时,一个参数传入需要调用的命令,之后的参数传入命令的选项,最后一个参数为“NULL”标志参数的结束。iii.dup2()用来对文件描述符进行重定向。实验中主要是把文件的描述符或管道的输出端重定向到进程的标准输入和把进程的标准输出重定向到文件或管道的输入端。iv.pipe()用来建立管道,连接两个进程之间的输入和输出。v.open()用来打开文件,获取文件描述符。vi.wait()用来等待子进程结束。b)实验结果i.执行命令“grep–vusr/etc/passwd|wc–lresult.txt”的结果ii.执行编译成的exp2后的结果:4.实验代码:#includefcntl.h#includesys/types.h#includesys/stat.h#includesys/wait.h#includeunistd.h#includestdlib.h#includestring.h#includestdio.hintmain(){intsv,fd[2],infile,outfile;char*file;pipe(fd);//createpipefile=/etc/passwd;infile=open(file,O_RDONLY);file=result.txt;outfile=open(file,O_CREAT|O_WRONLY);if(fork()==0){dup2(infile,0);//redirectstdintoinfiledup2(fd[1],1);//redirectstdouttopipeinclose(fd[1]);close(fd[0]);execlp(grep,grep,-v,usr,NULL);//execcommend}elseif(fork()==0){dup2(fd[0],0);//redirectstdouttooufiledup2(outfile,1);//redirectstdouttooutfileclose(fd[1]);close(fd[0]);execlp(wc,wc,-l,NULL);//execcommend}close(fd[1]);close(fd[0]);wait(&sv);wait(&sv);return0;}5.问题:开始照书上写的execlp(wc,wc,-l,0);调用系统命令时,产生了错误,经过查找资料,发现需要将标志参数结束的0换成NULL,成功解决了问题。6.心得:通过本次实验,我了解到文件描述符的使用,能够使用dup2系统调用将标准的输入输出流重定向到其他文件和使用exec调用程序,并传入参数。

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功