是否有可能确定您正在运行的ruby的实现是否能够支持fork
,而不运行针对RUBY_PLATFORM
的正则表达式,它将会扩展到summons Cthulhu?
(相关问题:Ruby - How can I find out on which system my program is running?)
编辑:我尝试过Marc-Andre的建议。默认情况下,它对于禁用了fork的jruby不起作用:
192-168-1-7:~ agrimm$ jruby --1.9 -S jirb
irb(main):001:0> RUBY_VERSION
=> "1.9.2dev"
irb(main):002:0> Process.respond_to?(:fork)
=> true
irb(main):003:0> Process.fork
NotImplementedError: fork is unsafe and disabled by default on JRuby
更新:从Marc-Andre的链接来看,从创建ruby实现的角度来看,这个问题看起来比我解决这个问题更加明智,而且失败了。
从正在编写ruby库的人的角度来看,什么是最全面的咒语,缺少运行fork并查看它是否会引发异常?
答案 0 :(得分:3)
在Ruby 1.9中:
Process.respond_to?(:fork) # => true if fork is supported, false otherwise
对于Ruby 1.8或JRuby(目前尚未实现),您必须对其进行实际测试。
另请参阅ruby-core上的long discussion。
答案 1 :(得分:1)
而不是针对RUBY_PLATFORM或其他事情的容易出错的测试,您可以自己测试fork
:
def can_fork?
pid = fork
exit unless pid # exit the child immediately
true
rescue NotImplementedError
false
end
如果以某种方式模拟fork
可能会使此检查变得昂贵,那么一个缺点就是。
答案 2 :(得分:0)
导航recent commit使用
Config::CONFIG['host_os'] !~ /mswin|mingw/)
测试它是否不在Windows上,
RUBY_PLATFORM !~ /java/
测试它是否不在JRuby上。但是,我知道可以将fork
作为命令行开关启用。我必须研究是否有任何方式来判断它是否已被启用。
我怀疑macruby不支持,或强烈反对,分叉,并且从Marc-Andre所指的线程中,你可以用
来测试它。 RUBY_ENGINE != "macruby"
现在所有其他平台都在那里......(正在进行中,标记为社区维基,请随时编辑)