Как определить, может ли ruby ​​работать без чрезмерного использования регулярных выражений? - PullRequest
3 голосов
/ 23 апреля 2010

Можно ли определить, способна ли реализация ruby, на которой вы работаете, поддерживать fork, не выполняя регулярное выражение для RUBY_PLATFORM, которое будет расширяться до тех пор, пока не вызовет Ктулху ?

(Смежный вопрос: Ruby - Как узнать, в какой системе запущена моя программа? )

Редактировать : я пробовал Marc-Andreпредложение.Это не работает для 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

Обновление : По ссылке Марка-Андре, кажется, что мудрее, чем я столкнулся с этой проблемой с точки зрениясоздания реализаций ruby, но не удалось.

С точки зрения того, кто пишет библиотеку ruby, каким было бы наиболее полное заклинание, если бы не запускать fork и посмотреть, вызывает ли оно исключение?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

В Ruby 1.9:

Process.respond_to?(:fork)  # => true if fork is supported, false otherwise

Для Ruby 1.8 или JRuby (который не реализует это в настоящее время) вам придется на самом деле протестировать его.

См. Также длинное обсуждение на ruby-core.

1 голос
/ 23 апреля 2010

Вместо подверженного ошибкам тестирования по RUBY_PLATFORM или другим вещам, вы можете протестировать fork само по себе:

def can_fork?
  pid = fork
  exit unless pid # exit the child immediately
  true
rescue NotImplementedError
  false
end

Один недостаток был бы, если fork каким-то образом эмулируется, что может сделать эту проверку дорогой.

0 голосов
/ 27 апреля 2010

A недавний коммит для рельсов использует

Config::CONFIG['host_os'] !~ /mswin|mingw/)

, чтобы проверить, работает ли он не в Windows, и

RUBY_PLATFORM !~ /java/

, чтобы проверить, нет ли он на JRuby.Однако я знаю, что возможно включить fork в качестве параметра командной строки.Мне нужно было бы выяснить, есть ли какой-нибудь способ сказать, была ли она включена.

Я подозреваю, что Макруби не поддерживает или настоятельно не поощряет разветвление, и из потока, на который ссылается Марк-Андре, вы можетепротестируйте его с помощью

 RUBY_ENGINE != "macruby"

Теперь для всех остальных платформ ... (работа продолжается, пометка как вики сообщества, пожалуйста, не стесняйтесь редактировать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...