% exec, system, IO.popopen .. какой куленд использовать в Ruby? - PullRequest
0 голосов
/ 15 сентября 2011

Я пытаюсь понять, какую из команд% exec, system, IO.popopen я могу использовать в Ruby для каких обстоятельств.

Эти страницы объясняют это, но я не думаю, поэтому я вполне понимаю, что означает запуск нового приложения и т. Д.http://humblelittlerubybook.com/book/html/chapter4.html

Насколько я понимаю:% exec: берет на себя процесс вашего приложения и запускает новую команду.Значит ли это, что после завершения системной команды она просто завершает работу ИЛИ возобновляет ли процесс родительского приложения?

io.popopen: порождает новый поток и возвращает выходные данные и возвращает ошибки в родительское приложение?Эта безопасная команда используется, когда вы хотите порождать поток и делать что-то параллельно?

system: порождает подпроцесс.Это, вероятно, означает, что элемент управления возвращается к родителю после того, как завершился процесс?Останавливает ли родительский процесс, пока дочерний процесс не завершит выполнение?[это звучит опасно]

Может ли кто-нибудь объяснить мне по-английски, при каких обстоятельствах мы используем эти команды?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

exec () используется для замены текущей исполняемой программы на программу, указанную в качестве параметра для exec (). Программа, которую вы указываете в качестве параметра для exec () , становится текущей выполняемой программой. Если вы используете RoR, вы, вероятно, не хотите этого делать. Если вы используете старый добрый Ruby для программы, вы можете захотеть сделать это при определенных обстоятельствах.

system () используется для вызова новой программы в подоболочке. Выполняемая в настоящий момент программа заблокирует или подождет, пока запущенная программа не завершит работу. Вы правы - это может быть опасно, если у вас есть долгосрочная программа. Если у вас есть программа, которая может быть запущена, но вы хотите использовать систему, вы можете заключить системный вызов в дочернюю часть вызова fork (), и родительский процесс уничтожит дочерний процесс, если он выполняется слишком долго. Подробнее о вилке (): http://en.wikipedia.org/wiki/Fork_%28operating_system%29

system () не даст вам STDOUT или STDERR приложения в его возвращаемом значении. Вместо этого вы получите код состояния выхода. Общепринято, что программы завершают работу с кодом состояния 0, если они успешны, и любым другим, если они терпят неудачу.

Обратные метки являются альтернативой system (), которая возвращает не код состояния выхода, а фактическое STDOUT программы, которая была выполнена. Вы можете получить код завершения программы через "$?" переменная.

IO.popopen () (и Open3 и Open4) позволяет работать с STDIN и STDOUT подпроцесса.

Это, кажется, хорошее место, чтобы немного ближе познакомиться с некоторыми из этих концепций, так как они реализованы в Ruby: http://tech.natemurray.com/2007/03/ruby-shell-commands.html

0 голосов
/ 15 сентября 2011

exec - это то, что большинству людей не нужно использовать.Выполненная программа становится активной программой, ваша исходная программа теряет выполнение, файловые дескрипторы и т. Д.

popen относится к стандартному вводу и выводу, что означает, что его можно использовать с фильтрами, т.е. программами, которые пишут или читают со стандартного ввода/output.

Система лучше используется для выполнения программы, ваша исходная программа продолжает выполняться, но ожидает, пока эта программа, вызванная системой, завершится.

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