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