LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 753|回复: 7

真正的shell是怎么实现里面的管道(shell中提供的)的?

[复制链接]
发表于 2004-12-15 14:27:57 | 显示全部楼层 |阅读模式
像bash shell是怎么实现管道的?
安装《边干边学》上的做法是用pipe()打开一个管道,然后把管道的一端重定向为一个命令的标准输出,把管道的另一端重定向为标准输入的。
我也这样做的,不过遇到很多问题。
比如在/dev目录下执行ls|more
因为dev下的文件很多,不可能像变干边学上的做法把ls输出的东西全都写到管道里,然后退出在运行more把数据从管道里读出来。所以必须让ls写管道的同时让more从管道把数据读走。不过有一个问题是more的标准输入被重定向到一个管道上,可是more打印一个屏幕之后会要求用户翻屏。遗憾的是现在more根本就不可能从键盘上读数据了。那怎么才能让more从键盘上读到数据呢?或者说shell中的管道是不是真的是这样实现的?
还有一个很奇怪的现象:我运行ls|more之后这两个命令就挂在那了。然后我在键盘上敲入任何字符都不会在屏幕上输出,但是shell确实是接收到了这些输入的字符的啊!这是为什么啊?
发表于 2004-12-15 15:03:52 | 显示全部楼层

回复: 真正的shell是怎么实现里面的管道(shell中提供的)的?

最初由 icoming 发表

不过有一个问题是more的标准输入被重定向到一个管道上,可是more打印一个屏幕之后会要求用户翻屏。遗憾的是现在more根本就不可能从键盘上读数据了。那怎么才能让more从键盘上读到数据呢?

为了处理这种情况,专门有一个设备/dev/tty,可以用来在标准输入被重定向时接收用户输入。
 楼主| 发表于 2004-12-15 21:48:07 | 显示全部楼层
那具体要怎么做的呀?
unix高级环境编程的后半部分是不是讲到了这个。
这本书的后半部分我看得不是很懂
发表于 2004-12-16 16:14:27 | 显示全部楼层
我原来回答过这个问题,你搜索一下看看。
 楼主| 发表于 2004-12-17 01:27:24 | 显示全部楼层
我明白怎么一回事了。
我编的shell在运行ls|more的时候,shell没有被阻塞掉,所以ls|more还没有退出的时候,shell已经开始从标准输入读数据了。这样more就不能从/dev/tty那里读数据了
发表于 2004-12-17 10:21:32 | 显示全部楼层
shelll怎么会被 阻塞呢?应该是ls的执行结果在被重定向到more时被 阻塞。
发表于 2004-12-17 10:22:20 | 显示全部楼层
楼主写的到底是shell程序还是C程序?这两个东东是有差别的。
 楼主| 发表于 2004-12-17 18:23:29 | 显示全部楼层
我是在用c编一个mini的shell。
shell在运行命令的时候,shell本身不会被阻塞的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表