上机作业4 : Shell管道和重定向功能的实现
2019211304
2019211297
马贝宁
1 实验要求
使用fork(), exec(), dup2(), pipe() ,open(),wait()等系统调用编写C语言程序完成与下列shell命令等价的功能。
grep -v usr < /etc/passwd | wc –l > r.txt; cat r.txt
(提示:为简化编程,不需要用strtok断词,直接用execlp实现能达到shell命令相同功能的程序即可)
例如:execlp(“grep”, “grep”, “-v”, “usr”, 0);
2 实验过程
2.1 命令分析
grep -v usr < /etc/passwd
将/etc/passwd作为重定向输入,查找不含有usr字段的行
wc –l > r.txt
统计输入文本的行数,并通过输出重定向到r.txt中,此时第一步的输出通过管道机制传入
cat r.txt
获取文件r.txt的内容并输出到屏幕上
2.2 函数设计
2.2.1 pipe()
pipe[fd]用于创建管道,申请数组fd[2],其中fd[0]进行读操作,fd[1]进行写操作
2.2.2 fork()
fork用于创建进程,在这里用于执行各条指令
2.2.3 dup2()
dup2()用来复制文件描述符,可以将文件保存到磁盘中
2.2.4 execlp()
用一个指定的程序文件,重新初始化一个进程,可指定新的命令行参数
其中execlp的系统调用格式为:
execlp(char *file,char *arg0,char *arg1,...,0);
2.2.5 wait()
等待进程的子进程终止,其中wait(&sv)中的sv保存子进程终止的原因
2.2.6 open()
用于打开或创建一个文件
2.3 程序设计
2.3.1 grep指令
if (fork() == 0) //子进程,进行grep指令的执行
{
dup2(open("/etc/pa

该博客详细介绍了如何利用C语言的系统调用,如fork(), exec(), dup2(), pipe(), open()和wait(),来实现与Linux shell命令等价的管道和重定向功能。作者通过分析grep、wc和cat三个命令,展示了如何通过子进程和文件描述符的复制来实现数据的传递和存储。实验结果表明,该程序成功地实现了从/etc/passwd文件中过滤掉包含'usr'字段的行,统计行数并将结果写入r.txt,最后输出r.txt内容到屏幕。通过这个实验,作者加深了对Linux管道和重定向的理解,并提升了编程技能。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



