【问题标题】:fork with Ruby 1.8 and Windows使用 Ruby 1.8 和 Windows 分叉
【发布时间】:2011-04-20 16:13:03
【问题描述】:

我正在使用 ruby​​ 1.8.7 补丁级别 302,并且正在使用 Windows xp 系统。 我必须启动一个需要对用户输入做出反应的外部进程。如果我使用线程,该过程不会做出反应,所以我尝试使用 fork。使用 fork,外部进程会对用户输入做出反应,但它执行的不仅仅是 fork 块。例如

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

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

parent
child
parent
done
done

正如你所见,'done' 和 'parent' 被打印了两次。我该怎么做才能让孩子只执行它的块而不是更多? (由于一些 gem,我无法切换到 Ruby 1.9)

【问题讨论】:

  • 你在使用 cygwin ruby​​ 吗?叉子是如何工作的?
  • 分叉是如何工作的?你在使用 win32 库吗?
  • 您需要 win32 进程 gem。在 ruby​​ 1.8.7 上,您需要 0.6.6 版(至少对于 Windows 8)

标签: ruby windows fork


【解决方案1】:

我找到了一个临时的。当我在子块的末尾添加 Process.kill(1, 0) 时,它的工作方式就像它应该的那样。但我认为这不是最好的解决方案。因此,如果有人知道真正的解决方案,我仍然会很高兴。

【讨论】:

  • @rogerdpack 我正在使用 win32-process gem,它实现了 Windows 默认 ruby​​ 中不可用的进程方法。我不使用cygwin。我必须承认我并不完全了解 fork 是如何工作的。我查看了一本 Ruby 书籍中的示例代码,我希望 gem 能够像 Linux Process.fork 方法一样工作。
  • 临时,第二部分:因为洞父进程是一种复制,所以一开始可能有部分不应该由子进程运行。要确定子进程是否正在运行,请检查最后一个参数(ARGV[ARGV.size-1] 如果 ARGV.size > 0)。如果是子进程,就是“child#x”。
【解决方案2】:

这样:

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

【讨论】:

    【解决方案3】:

    我认为你只需要Process.exit! 就可以结束你的分叉了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      相关资源
      最近更新 更多