2011-03-18 66 views
3

我试图启动一个红宝石实例作为我的节点程序的子进程。事实上,一切都很好,但我无法与ruby的STDIN和STDOUT交互。 (当然,Ruby程序在我的终端工作与我的键盘输入)Ruby的子进程与node.js

所以这是我想工作的简化代码...

simpleproc.js

var util = require('util'), 
    spawn = require('child_process').spawn, 
    ruby = spawn('ruby', [__dirname + '/process.rb']); 

ruby.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

ruby.stderr.on('data', function (data) { 
    console.log('stderr: ' + data); 
}); 

ruby.on('exit', function (code) { 
    console.log('child process exited with code ' + code); 
}); 

ruby.stdin.write("ping\n"); 

过程。 rb

f = File.new("process.log", "w") 
f.write "=== Hello! ===\n" 
STDIN.each_line do |line| 
    STDOUT.write line 
    f.write line 
end 

它有什么问题?我已经设法得到另一个进程工作......但在这里,没有IO!什么都没发生 !

编辑:我修改了红宝石文件,以显示,与节点,该文件只写入=== Hello! ===\n里面。因此,我们可以说,红宝石文件正确启动,但没有收到任何节点(我试过STDOUT.write,但永远不会执行do语句后刷新。

+0

我试过使用你的例子,但ruby似乎挂起之前它甚至创建该日志文件。任何想法?http://stackoverflow.com/questions/6902641/node-js- ruby-subprocess-hangs – 2011-08-01 18:25:07

回答

3

STDOUT.write后的红宝石侧试STDOUT.flush , 作为输出被缓冲。

+0

对不起,但它没有工作,因为红宝石STDIN,没有收到任何东西。如果我尝试写在do语句中的文件,反正没有任何反应。所以,我看不到在哪里问题是,但这可能是由于我的节点的版本(马在github回购中的ster分支)。 – 2011-03-19 09:04:49

+0

也许这是版本。使用节点0.4.2和红宝石1.8.7(苹果机)你的代码适用于我后,我添加一个冲洗(没有它的沉默)。从ruby写入文件或节点应该没有什么区别。 – michaelku 2011-03-19 09:16:18

+0

哦,男孩!事实上,我写了'ruby.stdin.write(“ping”);'在我自己的JS文件中。但是无论如何谢谢你,你的回答很好,因为没有冲洗指令,就没有办法让它工作!谢谢 ! – 2011-03-19 09:47:07