プロセスの終了ステータスを表すクラスです。メソッド Process.#wait2 などの返り値として使われます。
wait を使用した例
fork { exit } Process.wait case when $?.signaled? p "child #{$?.pid} was killed by signal #{$?.termsig}" if $?.coredump? # システムがこのステータスをサポートしてなければ常にfalse p "child #{$?.pid} dumped core." end when $?.stopped? # 実際には Process.wait を使用しているので、ここに来ることはない p "child #{$?.pid} was stopped by signal #{$?.stopsig}" when $?.exited? p "child #{$?.pid} exited normally. status=#{$?.exitstatus}" 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}" if $?.coredump? puts " child #{$?.pid} dumped core." end when $?.stopped? puts " child #{$?.pid} was stopped by signal #{$?.stopsig}" when $?.exited? puts " child #{$?.pid} exited normally. status=#{$?.exitstatus}" 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 normally. status=0 done
self & other -> Integer
[permalink][rdoc]self.to_i & other と同じです。このメソッドは後方互換性のためにあります。
self == other -> bool
[permalink][rdoc]同じステータスの場合に真を返します。
other が数値の場合、self.to_i との比較が行われます。これは後方互換性のためです。
self >> num -> Integer
[permalink][rdoc]self.to_i >> num と同じです。
fork { exit 99 } #=> 26563 Process.wait #=> 26563 $?.to_i #=> 25344 $? >> 8 #=> 99
coredump? -> bool
[permalink][rdoc]終了時にコアダンプしていたら真を返します。
このメソッドは signaled? が真のときにしか意味を持ちません。
このメソッドはシステムに依存します。サポートしないプラットフォームでは常に false を返します。
exited? -> bool
[permalink][rdoc]プロセスが exit(2) などにより正常に終了した場合に、真を返します。そうでない場合に false を返します。
exitstatus -> Integer | nil
[permalink][rdoc]exited? が真の場合プロセスが返した終了ステータスの整数を、そうでない場合は nil を返します。
inspect -> String
[permalink][rdoc]自身を人間が読みやすい形の文字列表現にして返します。
プロセスの状態を以下のフォーマットで返します。
#<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>
pid -> Integer
[permalink][rdoc]終了したプロセスのプロセス ID を返します。
signaled? -> bool
[permalink][rdoc]プロセスがハンドラを定義していないシグナルを受けて終了した場合に真を返します。
stopped? -> bool
[permalink][rdoc]プロセスが現在停止(終了ではない)している場合に真を返します。 Process.#waitpid に Process::WUNTRACED フラグを設定した場合にだけ真になりえます。
stopsig -> Integer | nil
[permalink][rdoc]stopped? が真の場合そのシグナルの番号を、そうでない場合は nil を返します。
success? -> bool
[permalink][rdoc]プロセスの終了状態が成功である場合に true を返します。そうでない場合に false を返します。
termsig -> Integer | nil
[permalink][rdoc]signaled? が真の場合プロセスを終了させたシグナル番号を、そうでない場合は nil を返します。
to_i -> Integer
[permalink][rdoc]C 言語での終了ステータス表現の整数を返します。
多くのシステムの実装では、この値の上位 8 bit に exit(2) に渡した終了ステータスが、下位 8 bit にシグナル等で終了した等の情報が入っています。
to_s -> String
[permalink][rdoc]to_i.to_s と同じです。