Module: ChildProcess

Defined in:
lib/childprocess.rb,
lib/childprocess/unix.rb,
lib/childprocess/errors.rb,
lib/childprocess/version.rb,
lib/childprocess/windows.rb,
lib/childprocess/unix/io.rb,
lib/childprocess/unix/lib.rb,
lib/childprocess/jruby/io.rb,
lib/childprocess/jruby/pump.rb,
lib/childprocess/windows/io.rb,
lib/childprocess/abstract_io.rb,
lib/childprocess/windows/lib.rb,
lib/childprocess/unix/process.rb,
lib/childprocess/jruby/process.rb,
lib/childprocess/windows/handle.rb,
lib/childprocess/windows/structs.rb,
lib/childprocess/windows/process.rb,
lib/childprocess/tools/generator.rb,
lib/childprocess/abstract_process.rb,
lib/childprocess/unix/fork_exec_process.rb,
lib/childprocess/windows/process_builder.rb,
lib/childprocess/unix/posix_spawn_process.rb,
lib/childprocess/jruby.rb

Defined Under Namespace

Modules: JRuby, Tools, Unix, Windows Classes: AbstractIO, AbstractProcess, Error, InvalidEnvironmentVariable, LaunchError, MissingPlatformError, SubclassResponsibility, TimeoutError

Constant Summary

VERSION =
"0.5.3"

Class Method Summary (collapse)

Class Method Details

+ (Object) arch



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# 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

+ (Object) close_on_exec(file)

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.



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# 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

+ (Boolean) jruby?



51
52
53
# File 'lib/childprocess.rb', line 51

def jruby?
  platform == :jruby
end

+ (Boolean) linux?



47
48
49
# File 'lib/childprocess.rb', line 47

def linux?
  os == :linux
end

+ (Object) new(*args) Also known as: build



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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

+ (Object) os



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# 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

+ (Object) platform



29
30
31
32
33
34
35
36
37
# 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

+ (Object) platform_name



39
40
41
# File 'lib/childprocess.rb', line 39

def platform_name
  @platform_name ||= "#{arch}-#{os}"
end

+ (Object) posix_spawn=(bool)

Set this to true to enable experimental use of posix_spawn.



83
84
85
# File 'lib/childprocess.rb', line 83

def posix_spawn=(bool)
  @posix_spawn = bool
end

+ (Boolean) posix_spawn?



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 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

+ (Boolean) unix?



43
44
45
# File 'lib/childprocess.rb', line 43

def unix?
  !windows?
end

+ (Boolean) windows?



55
56
57
# File 'lib/childprocess.rb', line 55

def windows?
  os == :windows
end