您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页北京邮电大学北京邮电大学Unix编程环境课程第二次实验报告

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

来源:五一七教育网


Unix 编程环境上机二

班级: 学号: 姓名:

1. 实验目的:

联系使用系统调用函数hi线一个shell命令功能,进一步熟悉进程控制与进程通信。 2. 实验要求:

使用fork(), exec(), dup2(), pipe() ,open()系统调用完成与下列shell命令等价的功能。

grep –v usr < /etc/passwd | wc –l > result.txt

3. 实验过程:

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 –v usr < /etc/passwd | wc –l > result.txt”的结果

ii.

执行编译成的exp2后的结果:

4. 实验代码:

#include

#include #include #include #include #include #include #include int main()

{

int sv,fd[2],infile,outfile; char *file;

pipe(fd);//create pipe file = \"/etc/passwd\";

infile = open(file,O_RDONLY); file = \"result.txt\";

outfile = open(file,O_CREAT|O_WRONLY); if(fork() == 0){ dup2(infile,0);//redirect stdin to infile dup2(fd[1],1);//redirect stdoutto pipe in close(fd[1]); close(fd[0]); execlp(\"grep\ }

else if(fork() == 0){ dup2(fd[0],0);//redirect stdout to oufile dup2(outfile,1);//redirect stdout to outfile close(fd[1]); close(fd[0]); execlp(\"wc\ }

close(fd[1]); close(fd[0]); wait(&sv); wait(&sv); return 0; } 5. 问题:

开始照书上写的execlp(\"wc\调用系统命令时,产生了错误,

经过查找资料,发现需要将标志参数结束的0换成NULL,成功解决了问题。 6. 心得:

通过本次实验,我了解到文件描述符的使用,能够使用dup2系统调用将标准的输入输出流重定向到其他文件和使用exec调用程序,并传入参数。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务