进程间通讯的方式有很多,一个简单的方法是标准IO
Ruby中的popen可以实现获取子进程的标准IO
以下是一个示例,客户端调用服务端并不断接收服务端传来的消息,然后输出到控制台
服务端每隔1s返回一下当前时间
使用Marshal来序列化,用EOF(是255吗?如果不是的话自行换掉。。)来表示终止
#server.rb
def output(object)
Marshal.dump(object)+255.chr
end
$stdin.sync = true
$stdout.sync = true #设置标准IO为同步模式,不使用缓存
loop{print output(Time.now);sleep 1}
#client.rb
def get(str)
Marshal.load str.chomp(255.chr)
end
cmd = 'ruby server.rb'
IO.popen cmd, 'r+' do |pipe|
pipe.binmode #设置管道为二进制模式
pipe.sync = true #设置管道为同步模式
loop do
puts get pipe.gets(255.chr)
end
end
如果要使用Stderr(标准错误输出),可以使用popen4库(open3是啥来着..)