2010-10-04 70 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'