我想用管道进行进程通信

#!/usr/bin/ruby
require "io/wait"
require 'pp'

rd, wr = IO.pipe
#Process.sync = true
Process.fork do
puts "Sending message to parent"
File.open("/home/alisoft/test.dump") do |f|
f.each do |l|
wr << l
#wr.flush
sleep rand(5)
end
end
wr.close
p "Write pipe closed."
end

Process.fork do
sl = ""
loop do
case rd.ready?
when Fixnum
p "Parent got: <#{rd.read(rd.ready?)}>"
when true,false,nil
#false eq rd.eof?
begin
p "Parent got: <#{rd.readpartial(1000)}>"
#这里用read方法的话会产生堵塞,
#用readpartial的话会不知道现有内容的长度。
rescue EOFError
(rd.close;exit(0)) if rd.eof?
end
else
#do nothing
end
p Time.now.to_s
end
end

puts "Main is going down"
pp Process.waitall
puts "Main over"


Ruby有堵塞和非堵塞管道两种实现。

感觉这种通信方式不如Socket,这个虽然快,但Socket更容易扩展,
比如使用内存Cache,只是不能将信号和数据一次就传过来,
1、A先告诉B内存Cache里面有新东西了,去更新吧。
2、B收到,更新了。

用System V的信号也好,32-64之间的信号可自定义,只是数据如何传递还要另想办法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值