Process.wait などで生成されるオブジェクト。プロセスの終 了ステータスを表現します。
self == other同じステータスの場合に真を返します。
other が数値の場合、self.to_i との比較が行われます。こ
れは後方互換性のためです。
self & otherto_i & other と同じです。
このメソッドは後方互換性のためにあります。
pid終了したプロセスのプロセス ID を返します。
to_iC 言語での終了ステータス表現の整数を返します。
多くのシステムの実装では、この値の上位 8 bit に exit(2) に渡した終了ステータスが、下位 8 bit にシグナル等で終了した等の情 報が入っています。
to_intto_i と同じです。このメソッドにより $? が Fixnum
として扱われるようになります(暗黙の型変換)。これは後方互換性のため
です。
fork { exit 1 }
Process.wait
p $? # => 256
to_sto_i.to_s と同じです。
exited?プロセスが exit(2) により自分で終了した(他のプロ セスに止められたのではない)場合、真を返します。
exitstatusexited? が真の場合プロセスが返した終了ステータスの整数を、そ
うでない場合は nil を返します。
inspect ((<ruby 1.8 feature>))プロセスの状態を以下のフォーマットで出力します。
正常終了のとき #<Process::Status: pid=18262,exited(nnn)> シグナルによる停止のとき #<Process::Status: pid=18262,stopped(SIGxxx=nnn)> シグナルによる終了のとき #<Process::Status: pid=18262,signaled(SIGxxx=nnn)> コアダンプしたとき(このステータスの表示はシステムに依存します) #<Process::Status: pid=18262,coredumped>
stopped?プロセスが現在停止(終了ではない)している場合に真を返します。
Process.waitpid に Process::WUNTRACED フラグを設定した
場合にだけ真になりえます。
stopsigstopped? が真の場合そのシグナルの番号を、そうでない場合は
nil を返します。
signaled?プロセスがハンドラを定義していないシグナルを受けて終了した場合に真 を返します。
termsigsignaled? が真の場合プロセスを終了させたシグナル番号を、
そうでない場合は nil を返します。
coredump?終了時にコアダンプしていたら真を返します。
(このメソッドはシステムに依存します。サポートしないプラットフォー ムでは常に false を返します)
wait を使用した例
fork { exit }
Process.wait
case
when $?.signaled?
p "child #{$?.pid} was killed by signal #{$?.termsig}"
when $?.stopped?
# 実際には Process.wait を使用しているので、ここに来ることはない
p "child #{$?.pid} was stopped by signal #{$?.stopsig}"
when $?.exited?
p "child #{$?.pid} exited normaly. status=#{$?.exitstatus}"
when $?.coredump? # システムがこのステータスをサポートしてなければ常にfalse
p "child #{$?.pid} dumped core."
else
p "unknown status %#x" % $?.to_i
end
SIGCHLD を trap する例
trap(:SIGCHLD) {|sig|
puts "interrupted by signal #{sig} at #{caller[1]}"
# 複数の子プロセスの終了に対して1つの SIGCHLD しか届かない
# 場合があるのでループさせる必要があります
while Process.waitpid(-1, Process::WNOHANG|Process::WUNTRACED)
case
when $?.signaled?
puts " child #{$?.pid} was killed by signal #{$?.termsig}"
when $?.stopped?
puts " child #{$?.pid} was stopped by signal #{$?.stopsig}"
when $?.exited?
puts " child #{$?.pid} exited normaly. status=#{$?.exitstatus}"
when $?.coredump?
puts " child #{$?.pid} dumped core."
else
p "unknown status %#x" % $?.to_i
end
end
}
p pid1 = fork { sleep 1; exit }
p pid2 = fork { loop { sleep } } # signal を待つための sleep
begin
Process.kill :STOP, pid2
sleep # SIGCHLD を待つための sleep
Process.kill :CONT, pid2
Process.kill :TERM, pid2
loop { sleep } # SIGCHLD を待つための sleep
rescue Errno::ECHILD
puts "done"
end
=> 12964
12965
interrupted by signal 17 at -:27:in `sleep'
child 12965 was stopped by signal 19
interrupted by signal 17 at -:30:in `sleep'
child 12965 was killed by signal 15
interrupted by signal 17 at -:30:in `sleep'
child 12964 exited normaly. status=0
done