module ChildProcess

Constants

VERSION

Public Class Methods

arch() click to toggle source
# File lib/childprocess.rb, line 113
def arch
  @arch ||= (
    host_cpu = RbConfig::CONFIG['host_cpu'].downcase
    case host_cpu
    when /i[3456]86/
      # Darwin always reports i686, even when running in 64bit mod
      if os == :macosx && 0xfee1deadbeef.is_a?(Fixnum)
        "x86_64"
      else
        "i386"
      end
    when /amd64|x86_64/
      "x86_64"
    when /ppc|powerpc/
      "powerpc"
    else
      host_cpu
    end
  )
end
build(*args)
Alias for: new
close_on_exec(file) click to toggle source

By default, a child process will inherit open file descriptors from the parent process. This helper provides a cross-platform way of making sure that doesn't happen for the given file/io.

# File lib/childprocess.rb, line 140
def close_on_exec(file)
  if file.respond_to?(:close_on_exec=)
    file.close_on_exec = true
  elsif file.respond_to?(:fcntl) && defined?(Fcntl::FD_CLOEXEC)
    file.fcntl Fcntl::F_SETFD, Fcntl::FD_CLOEXEC

    if jruby? && posix_spawn?
      # on JRuby, the fcntl call above apparently isn't enough when
      # we're launching the process through posix_spawn.
      fileno = JRuby.posix_fileno_for(file)
      Unix::Lib.fcntl fileno, Fcntl::F_SETFD, Fcntl::FD_CLOEXEC
    end
  elsif windows?
    Windows::Lib.dont_inherit file
  else
    raise Error, "not sure how to set close-on-exec for #{file.inspect} on #{platform_name.inspect}"
  end
end
jruby?() click to toggle source
# File lib/childprocess.rb, line 51
def jruby?
  platform == :jruby
end
linux?() click to toggle source
# File lib/childprocess.rb, line 47
def linux?
  os == :linux
end
new(*args) click to toggle source
# File lib/childprocess.rb, line 11
def new(*args)
  case os
  when :macosx, :linux, :solaris, :bsd, :cygwin, :aix
    if posix_spawn?
      Unix::PosixSpawnProcess.new(args)
    elsif jruby?
      JRuby::Process.new(args)
    else
      Unix::ForkExecProcess.new(args)
    end
  when :windows
    Windows::Process.new(args)
  else
    raise Error, "unsupported platform #{platform_name.inspect}"
  end
end
Also aliased as: build
os() click to toggle source
# File lib/childprocess.rb, line 87
def os
  @os ||= (
    require "rbconfig"
    host_os = RbConfig::CONFIG['host_os'].downcase

    case host_os
    when /linux/
      :linux
    when /darwin|mac os/
      :macosx
    when /mswin|msys|mingw32/
      :windows
    when /cygwin/
      :cygwin
    when /solaris|sunos/
      :solaris
    when /bsd/
      :bsd
    when /aix/
      :aix
    else
      raise Error, "unknown os: #{host_os.inspect}"
    end
  )
end
platform() click to toggle source
# File lib/childprocess.rb, line 29
def platform
  if RUBY_PLATFORM == "java"
    :jruby
  elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
    :ironruby
  else
    os
  end
end
platform_name() click to toggle source
# File lib/childprocess.rb, line 39
def platform_name
  @platform_name ||= "#{arch}-#{os}"
end
posix_spawn=(bool) click to toggle source

Set this to true to enable experimental use of posix_spawn.

# File lib/childprocess.rb, line 83
def posix_spawn=(bool)
  @posix_spawn = bool
end
posix_spawn?() click to toggle source
# File lib/childprocess.rb, line 59
def posix_spawn?
  enabled = @posix_spawn || %w[1 true].include?(ENV['CHILDPROCESS_POSIX_SPAWN'])
  return false unless enabled

  require 'ffi'
  begin
    require "childprocess/unix/platform/#{ChildProcess.platform_name}"
  rescue LoadError
    raise ChildProcess::MissingPlatformError
  end

  require "childprocess/unix/lib"
  require 'childprocess/unix/posix_spawn_process'

  true
rescue ChildProcess::MissingPlatformError => ex
  warn_once ex.message
  false
end
unix?() click to toggle source
# File lib/childprocess.rb, line 43
def unix?
  !windows?
end
windows?() click to toggle source
# File lib/childprocess.rb, line 55
def windows?
  os == :windows
end

Private Class Methods

warn_once(msg) click to toggle source
# File lib/childprocess.rb, line 161
def warn_once(msg)
  @warnings ||= {}

  unless @warnings[msg]
    @warnings[msg] = true
    $stderr.puts msg
  end
end