免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 854 | 回复: 2
打印 上一主题 下一主题

[文本处理] fifo写入端,会在读取端结束后立刻结束,而不是等所有内容都读完? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-03-04 15:11 |只看该作者 |倒序浏览
我开始对于fifo的期待是,例如,我写入100个字节,此时写端阻塞,等待读取端进程完全读完了以后,写端才返回。
但是我做了一个实验,发现还是不是这样的。

1. 首先我创建了一个fifo

    $mkfifo hfifo.txt

2. 然后有一个my.txt文件,分成好几行:

        $cat my.txt
        line1
        line2
        line3
        line4

3. 我打开一个终端tty1去写入hfifo.txt这个fifo:

    cat my.txt >hfifo.txt

4. 打开另一个终端tty2,去读取一行:

    $read l1<hfifo.txt

在执行命令的瞬间,tty1那边的cat命令也结束了,在tty2里面echo $l1显示line1而不是文件的全部内容。

我的疑问是: 既然tty里面的cat命令是要把整个文件的内容喂给hfifo.txt这个fifo,那么为什么读端读了一行,就结束了呢? 我期待读端下次可以继续read l2<hfifo.txt来读取"line2"这一样,而tty1要一直等到所有写入的数据都被读取了,才结束返回。

为什么系统的行为是这样的。fifo难道其中一端返回了,另一端就立刻返回吗? 我可以写一个bash脚本来调用read命令循环读取该fifo的内容,它不应该在我第一次read之后就退出啊。

关键问题是,
1. 写端如何知道读端读完一行以后就立刻返回了?
2. 读端出了一次性cat所有的内容以外,不能逐行,分步骤的读取吗? shell编程可以做到吗?

还请指点迷津。


论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
2 [报告]
发表于 2017-03-07 09:43 |只看该作者
1、你到底是要实现什么功能
2、写端打开fifo, 默认阻塞, 直到读端打开该fifo, 写端不管读端是否读取一行还是全部都读取了, 只要有进程读了, 写端就会over, 读端此时只是对fifo文件进行操作,应该就是这样
3、对于: "我可以写一个bash脚本来调用read命令循环读取该fifo的内容,它不应该在我第一次read之后就退出啊。"  这个问题,
     我测了下, 不管你是先  cat my.txt >hfifo.txt 然后 再 while read line; do echo $line; done < hfifo.txt 还是调用先后顺序倒置, 都会读出my.txt 的全部内容, 而且cat 进程会立马结束, 可以在while 中加个sleep 试下, while read line; do echo $line; sleep 2; done < hfifo.txt
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2017-03-07 14:48 |只看该作者
回复 2# elu_ligao

谢谢,应该就是你说的这样了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP