Shell::SystemCommand

Attributes

command[R]
name[R]

Public Class Methods

new(sh, command, *opts) click to toggle source
 
 # File shell/system-command.rb, line 17
def initialize(sh, command, *opts)
 if t = opts.find{|opt| !opt.kind_of?(String) && opt.class}
 Shell.Fail TypeError, t.class, "String"
 end
 super(sh)
 @command = command
 @opts = opts
 @input_queue = Thread::Queue.new
 @pid = nil
 sh.process_controller.add_schedule(self)
end
 

Public Instance Methods

active?() click to toggle source
 
 # File shell/system-command.rb, line 38
def active?
 @shell.process_controller.active_job?(self)
end
 
each(rs = nil) click to toggle source
 
 # File shell/system-command.rb, line 136
def each(rs = nil)
 while (l = @input_queue.pop) != :EOF
 yield l
 end
end
 
Also aliased as: super_each
flush() click to toggle source
 
 # File shell/system-command.rb, line 63
def flush
 @pipe_out.flush if @pipe_out and !@pipe_out.closed?
end
 
input=(inp) click to toggle source
 
 # File shell/system-command.rb, line 42
def input=(inp)
 super
 if active?
 start_export
 end
end
 
kill(sig) click to toggle source
 
 # File shell/system-command.rb, line 78
def kill(sig)
 if @pid
 Process.kill(sig, @pid)
 end
end
 
notify(*opts) click to toggle source

ex)

if you wish to output:
 "shell: job(#{@command}:#{@pid}) close pipe-out."
then
 mes: "job(%id) close pipe-out."
yorn: Boolean(@shell.debug? or @shell.verbose?)
 
 # File shell/system-command.rb, line 148
def notify(*opts)
 @shell.notify(*opts) do |mes|
 yield mes if iterator?
 mes.gsub!("%id", "#{@command}:##{@pid}")
 mes.gsub!("%name", "#{@command}")
 mes.gsub!("%pid", "#{@pid}")
 mes
 end
end
 
start() click to toggle source
 
 # File shell/system-command.rb, line 49
def start
 notify([@command, *@opts].join(" "))
 @pid, @pipe_in, @pipe_out = @shell.process_controller.sfork(self) {
 Dir.chdir @shell.pwd
 0ドル = @command
 exec(@command, *@opts)
 }
 if @input
 start_export
 end
 start_import
end
 
start_export() click to toggle source
 
 # File shell/system-command.rb, line 109
def start_export
 notify "job(%id) start exp-pipe.", @shell.debug?
 _eop = true
 Thread.start{
 begin
 @input.each do |l|
 ProcessController::block_output_synchronize do
 @pipe_out.print l
 end
 end
 _eop = false
 rescue Errno::EPIPE, Errno::EIO
 _eop = false
 ensure
 if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _eop
 notify("shell: warn: Process finishing...",
 "wait for Job(%id) to finish pipe exporting.",
 "You can use Shell#transact or Shell#check_point for more safe execution.")
 redo
 end
 notify "job(%id) close exp-pipe.", @shell.debug?
 @pipe_out.close
 end
 }
end
 
start_import() click to toggle source
 
 # File shell/system-command.rb, line 84
def start_import
 notify "Job(%id) start imp-pipe.", @shell.debug?
 _eop = true
 Thread.start {
 begin
 while l = @pipe_in.gets
 @input_queue.push l
 end
 _eop = false
 rescue Errno::EPIPE
 _eop = false
 ensure
 if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _eop
 notify("warn: Process finishing...",
 "wait for Job[%id] to finish pipe importing.",
 "You can use Shell#transact or Shell#check_point for more safe execution.")
 redo
 end
 notify "job(%id}) close imp-pipe.", @shell.debug?
 @input_queue.push :EOF
 @pipe_in.close
 end
 }
end
 
super_each(rs = nil) click to toggle source
Alias for: each
terminate() click to toggle source
 
 # File shell/system-command.rb, line 67
def terminate
 begin
 @pipe_in.close
 rescue IOError
 end
 begin
 @pipe_out.close
 rescue IOError
 end
end
 
wait?() click to toggle source
 
 # File shell/system-command.rb, line 34
def wait?
 @shell.process_controller.waiting_job?(self)
end
 

AltStyle によって変換されたページ (->オリジナル) /