module Spoon

Constants

P_NOWAIT

Public Class Methods

posix_spawn(path, file_actions, spawn_attr, argv, env = ENV) click to toggle source
# File lib/spoon/unix.rb, line 85
def self.posix_spawn(path, file_actions, spawn_attr, argv, env = ENV)
  pid_ptr, argv_ptr, env_ptr = _prepare_spawn_args(argv, env)
  error = LibC.posix_spawnp(pid_ptr, path, file_actions, spawn_attr, argv_ptr, env_ptr)
  raise SystemCallError.new(path, error) unless error == 0
  get_pid(pid_ptr)
end
posix_spawnp(file, file_actions, spawn_attr, argv, env = ENV) click to toggle source
# File lib/spoon/unix.rb, line 92
def self.posix_spawnp(file, file_actions, spawn_attr, argv, env = ENV)
  pid_ptr, argv_ptr, env_ptr = _prepare_spawn_args(argv, env)
  error = LibC.posix_spawnp(pid_ptr, file, file_actions, spawn_attr, argv_ptr, env_ptr)
  raise SystemCallError.new(file, error) unless error == 0
  get_pid(pid_ptr)
end
spawn(*args) click to toggle source
# File lib/spoon/unix.rb, line 99
def self.spawn(*args)
  posix_spawn(args[0], nil, nil, args, ENV)
end
spawnp(*args) click to toggle source
# File lib/spoon/unix.rb, line 103
def self.spawnp(*args)
  posix_spawnp(args[0], nil, nil, args, ENV)
end

Private Class Methods

_prepare_spawn_args(argv, env) click to toggle source
# File lib/spoon/unix.rb, line 172
def self._prepare_spawn_args(argv, env)
  pid_ptr = FFI::MemoryPointer.new(:pid_t, 1)

  args_ary = argv.inject(PointerArray.new) { |ary, str| ary << FFI::MemoryPointer.from_string(str) }
  env_ary = PointerArray.new
  env.each_pair { |key, value| env_ary << FFI::MemoryPointer.from_string("#{key}=#{value}") }

  [pid_ptr, args_ary, env_ary]
end
get_pid(ptr) click to toggle source
# File lib/spoon/unix.rb, line 130
def self.get_pid(ptr)
  ptr.get_int32(0)
end