LinuxSir.cn,穿越时空的Linuxsir!

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

关于有名管道和子进程的用法

[复制链接]
发表于 2009-12-7 14:16:30 | 显示全部楼层 |阅读模式

  1. #!/bin/sh
  2. n=5
  3. myfifo=pipe$$
  4. exec 4<>$myfifo

  5. wr() {
  6.         echo $cnt >> $myfifo
  7. }

  8. cnt=$n
  9. for (( i=0; i<$n; i++ ))
  10. do
  11.         wr&   #a
  12. #       echo $cnt >> $myfifo   #b
  13. done

  14. while read line
  15. do
  16.         echo $line
  17. done < $myfifo

  18. wait

  19. rm $myfifo
复制代码


在bash中,在for循环那,如果使用的是a那个语句,最后输出的结果是0-3个5,并不确定。而使用b那个语句的话,就能输出5个5了。为什么用子进程的时候会有消息丢失了呢?
好像我的管道的用法很不规范,还请各位指正。。。
发表于 2009-12-9 21:29:12 | 显示全部楼层
  1. myfifo=pipe$$
复制代码
楼主的PIPE 很有意思。不知谁告诉你的。
有名管道要用mkfifo来创建……
  1.         wr&   #a
复制代码
既然你用的是普通文件,就看这个后台子进程和前台进程谁执行的快了,根据你说的结果,这n个后台进程执行的有点儿慢,呵呵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-12 23:53:24 | 显示全部楼层
呵呵,不好意思上面的漏了mkfifo这句话。不过,有个问题,当mkfifo然后用fd之后,while read line当pipe为空的时候会阻塞在那里。这时我的解决方法是改成while read -t 1 line. 不知有没有更好的方法? 不使用fd而是直接read pipe倒不会这样。不过,两个都还是会有消息泄漏阿。我开30个进程写4万8千条url进pipe里,用fd的话能读到4万条左右,直接用fifo文件的话读到两三万的时候管道就空了。。。
回复 支持 反对

使用道具 举报

发表于 2009-12-13 21:23:37 | 显示全部楼层
1.  你的脚本号称是#!/bin/sh。从你写的脚本看,实际上肯定不是sh(ash、dash等)。不知道你这系统里是把sh指向哪个shell了。

2.  你的fd的写法很... 一般来说,一个FIFO只有两个对外的“口”,你一个fd就把两个“口”都给堵上了,先不管你的语法是否正确,个人认为这样写的想法是非常错误的。

3.  在读管道时别直接用echo,用/bin/echo命令;或者直接cat。也许可以解决问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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