首先关注下 管道命令,管道命令简单的说,其实就是在第一个命令执行结束后把第一个命令的执行结果传递给下个命令来处理。
例如 : ls -l | more
其实就是想到于执行 列表命令 后 列表结果传递给 more 来执行分页显示。
看到这里,就应该让我们想到使用管道命令来实现应该会非常简单。
先给出一个非常简单的管道命令执行程序:
这个程序 直接调用了 popen 函数来实现这个 举例的命令,而并没有使用 fork 和 exec 函数族,但是 popen 函数实际就是相当于 pipe、dup、 fork 和 exec 的组合函数,只不过增加了很多的其他的处理,这里我们可以查看源码就能知道。
函数原型 : FILE *popen(const char *program, const char *type)
第一个参数是需要执行的命令,第二个参数则是 要从执行结果写入还是读出。
这样我们可以很清楚的看到这个命令的执行过程。
那么我们要做的就是 相当于模拟组合 popen 函数来执行 管道命令。
查阅 popen函数的源码 如下:
接着我们就该分析这个函数的执行过程了。
从代码中我们可以看到,这个popen 函数 中间主要执行的过程 大致可以 这么概括:
1.创建管道 - > 2.创建子进程 - > 3.标准输入输出端口和管道端口转换 (dup2 函数) - > 4.把结果流与一个文件句柄相接 -> 5.返回 文件句柄
这样子看起来 程序执行的过程和我们需要达到的目标已经很近了。在习题中并不带有文件操作,因此我们在实际实现的时候可以取消 第四和第五步工作,拿第一个程序来说,它做的事情比我们需要达到的目标做了更多不必要做的事情,因此过程我们可以简化成:
1.创建管道 - > 2.创建子进程 - > 3.标准输入输出端口和管道端口转换 (dup2 函数)
这样子基本上就达到了我们的习题要求。
下面是我写的一个习题的解决方案:
如有错误请大家指正,谢谢!
欢迎大家提供更多的解决方案....