免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hlsz
打印 上一主题 下一主题

这样用管道错在哪? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-11-29 21:07 |只看该作者
原帖由 waker 于 2007-11-29 20:51 发表
grep缺省工作在`full buffered'模式下面,它在结束前或buffer满的时候才输出结果
tail -f 永远不送出EOF,所以grep会等buffer满了才输出

--line-buffer可以强制GNU grep工作在行缓冲模式下

或许还能想办 ...


学习ing 哈哈

论坛徽章:
0
12 [报告]
发表于 2007-11-30 12:31 |只看该作者

回复 #10 waker 的帖子

学习了。我装了个gnu grep在aix上了事。。。
顺便问一下,为什么grep后面什么都没有写,直接往stdout输出,屏幕会有显示呢??难道这种情况就不用缓存了吗??
但我觉得对grep进程来讲,他并不知道是往哪里输出的啊。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
13 [报告]
发表于 2007-11-30 12:43 |只看该作者
原帖由 hlsz 于 2007-11-30 12:31 发表
学习了。我装了个gnu grep在aix上了事。。。
顺便问一下,为什么grep后面什么都没有写,直接往stdout输出,屏幕会有显示呢??难道这种情况就不用缓存了吗??
但我觉得对grep进程来讲,他并不知道是往哪里输 ...

屏幕其实就是tty,grep对tty输出的时候工作在linebuffer模式正面
但是你用|grep|cmd的方式,第一个grep的输出就是fullbuffer模式

论坛徽章:
0
14 [报告]
发表于 2007-11-30 13:38 |只看该作者

回复 #13 waker 的帖子

明白你的意思了。也就是说grep的代码里应该有一段判断标准输出是文件 还是tty,如果是tty就用linebuffer
如果是文件,为了性能,就用fullbuffer。对吗?

论坛徽章:
0
15 [报告]
发表于 2007-11-30 16:30 |只看该作者
不是grep做的判断,而是libc内部做的判断,
对于tty,libc是行缓冲,一行结束立即write出来;
对于普通文件,libc会建立一个更大缓冲区,如果缓冲区满了,才write到普通文件.

楼主的情况是普通文件,libc默认不是行缓冲,
而grep输出的数据没法充满缓冲区, 自然底层是不会调用write的,

你可以试试建立一个一行有几千个字符'a'的文件,大过libc的缓冲区,
然后 tail -f file | grep 'a' >output, 你会发现不用--line-buffer也一样会输出到output

[ 本帖最后由 seeLnd 于 2007-11-30 16:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP