2010-10-04 43 views
1

我使用红宝石1.8.7 patchlevel 302,我正在使用Windows XP系统。 我必须启动一个需要对用户输入做出反应的外部进程。如果我使用线程,进程不会反应,所以我尝试使用fork。对于fork,外部进程会对用户输入做出反应,但它不仅仅执行fork块。例如分叉与红宝石1.8和Windows

fork do 
    puts 'child' 
end 
puts 'parent' 
Process.wait 
puts 'done'

产生在我的机器上输出如下:

parent 
child 
parent 
done 
done 

正如你可以看到“做”和“父”打印两次。我能做些什么来让孩子只执行其块,而不是更多? (因为一些宝石,我不能切换到Ruby 1.9)

+0

你使用的是cygwin ruby​​吗?叉如何工作? – rogerdpack 2010-10-04 18:59:28

+1

叉子是如何工作的?你使用win32库吗? – 2013-07-10 07:03:34

+0

您需要win32-进程宝石。在红宝石1.8.7你需要版本0.6.6(至少对于Windows 8) – Automatico 2014-05-16 15:26:31

回答

0

我发现了一些小小的凑合。它的工作原理与我在子块的末尾添加Process.kill(1,0)时一样。但我认为这不是最好的解决方案。所以如果有人知道真正的解决方案,我仍然会很开心。

+0

@rogerdpack我使用的是win32进程gem,它实现了在Windows默认ruby中不可用的进程方法。我不使用cygwin。我必须承认我不完全知道叉子是如何工作的。我看了一本Ruby书中的示例代码,我希望这个gem能像Linux Process.fork方法一样工作。 – user1602568 2010-10-05 06:15:48

+0

Makeshift,第二部分:因为孔母体过程是复制的,所以在开始时可能有些部分不应该由孩子运行。要确定子进程是否正在运行,请检查最后一个参数(如果ARGV.size> 0,则为ARGV [ARGV.size-1])。如果它是一个孩子的过程,它是“孩子#x”。 – user1602568 2010-10-20 05:29:43

2

就像是:

if child = fork 
    puts 'parent' 
    Process.wait 
    puts 'done' 
else 
    puts 'child' 
end 
+0

这个叉子如何在Windows上工作?你在使用一些库吗? – Automatico 2014-03-24 18:48:18

0

我想你只需要Process.exit!你结束前叉子。

fork do 
    puts 'child' 
    Process.exit! 
end 
puts 'parent' 
Process.wait 
puts 'done'