第一课习题之我的解决方案

  首先关注下 管道命令,管道命令简单的说,其实就是在第一个命令执行结束后把第一个命令的执行结果传递给下个命令来处理。

   例如 : 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 函数)

  

   这样子基本上就达到了我们的习题要求。

  下面是我写的一个习题的解决方案:

  

  

   如有错误请大家指正,谢谢!

   欢迎大家提供更多的解决方案....

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值