Process

UNIX のプロセスを管理するモジュール。Process.exit!, Process.fork 以外のメソッドは全てモジュール関数 (Module#module_function)です。

Process がプロセスを表現するクラスではなく、プロセスに対する操作 をまとめたモジュールであることに注意してください。

モジュールメソッド:

Process.exit!([status])

関数 exit! と同じです。

Process.fork
Process.fork { ... }

関数 fork と同じです。

モジュール属性:

Process.egid

カレントプロセスの実効グループ ID を返します。

Process.egid=gid

カレントプロセスの実効グループ ID を設定します。gid を返します。

Process.euid

カレントプロセスの実効ユーザ ID を返します。

Process.euid=uid

カレントプロセスの実効ユーザ ID を設定します。uid を返します。

Process.gid

カレントプロセスの実グループ ID を返します。

Process.gid=gid

カレントプロセスの実グループ ID を設定します。gid を返します。

Process.pid

カレントプロセスのプロセス ID を返します。変数 $$ の値と同じです。

Process.ppid

親プロセスのプロセス ID を返します。UN*X では実際の親プロセスが終 了した後は ppid は 1 (initの pid)になります。

Process.uid

プロセスの実ユーザ ID を返します。

Process.uid=uid

プロセスの実ユーザ ID を設定します。uid を返します。

モジュール関数:

Process.getpgid(pid)
Process.getpgrp([pid])

pid のプロセスのプロセスグループを返します。pid が 0 の時や省略された時はカレントプロセスを意味します。

プロセスグループの取得に失敗した場合は、例外 Errno::EXXX が 発生します。 *1

Process.getpriority(which, who)

プロセス、プロセスグループ、ユーザの現在のプライオリティを返 します(getpriority(2) 参照)。

Process モジュールは which として指定できる定数 PRIO_PROCESS, PRIO_PGRP, PRIO_USER を定義しています。

who には、which の値にしたがってプロセス ID、プロセス グループ ID、ユーザ ID のいずれかを指定します。

プライオリティの取得に失敗した場合は、例外 Errno::EXXX が発 生します。

Process.kill(signal, pid ... )

pid で指定されたプロセスにシグナルを送ります。signal はシグナル番号か名前(文字列またはSymbol)で指定します。負の値 を持つシグナル(あるいはシグナル名の前に-)を与えるとプロセス ではなくプロセスグループにシグナルを送ります。

全てのシグナル送信に成功した場合、指定した pid の数を返します。 失敗した場合は例外 Errno::EXXX が発生します。

存在しないシグナルを指定した場合は、例外 ArgumentError が発 生します*2

Process.setpgrp(pid, pgrp)
Process.setpgrp ((<ruby 1.7 feature>))
Process.setpgid(pid, pgrp)

pid のプロセスグループを設定します。pid が 0 の時はカ レントプロセスを意味します。

プロセスグループの設定に成功した場合は 0 を返します。失敗した場合 は、例外 Errno::EXXX が発生します。

ruby 1.7 feature: version 1.7 では、Process.setpgrp は、引数を取りません。

Process.setpriority(which, who, prio)

プロセス、プロセスグループ、ユーザの現在のプライオリティを設 定します(setpriority(2) 参照)。

Process モジュールは which として指定できる定数 PRIO_PROCESS, PRIO_PGRP, PRIO_USER を定義しています。

who には、which の値にしたがってプロセス ID、プロセス グループ ID、ユーザ ID のいずれかを指定します。

prio には、-20 から 20 の値を設定します。

プライオリティの設定に成功した場合は 0 を返します。失敗した場合は、 例外 Errno::EXXX が発生します。

Process.setsid()

新しいセッションを作成して、tty を切り離します。デーモンを簡単に作 ることができます。セッション ID を返します。

セッション ID の作成に失敗した場合は、例外 Errno::EXXX が発 生します。

Process.times ((<ruby 1.7 feature>))

自身のプロセスとその子プロセスが消費したユーザ/システム CPU 時間の 積算を Struct::Tms のオブジェクトとして返します。 Struct::Tms は以下のメンバを持つ構造体クラスです。

utime           # user time
stime           # system time
cutime          # user time of children
cstime          # system time of children

時間の単位は秒で、浮動小数点数で与えられます。詳細は times(3) を参照してください。

Process.wait
Process.wait2

子プロセスが終了するのを待ち、終了した子プロセスの pid を返します。 子プロセスが一つもなければ例外 Errno::ECHILD が 発生します。

wait2 は、その戻り値が pid と $? の配列であ る点だけが異なります。

ruby 1.7 feature: version 1.7 からは $?Process::Status オブジェクトで す。

Process.waitall ((<ruby 1.7 feature>))

全ての子プロセスが終了するのを待ちます。

終了した子プロセスの pid と終了ステータス(Process::Status)の 配列を要素に持つ配列を返します。子プロセスがいない状態でこのメソッ ドを呼び出すと空の配列を返します。

$? には最後に終了した子プロセスの終了ステータスが 設定されます。

例:

3.times {|n|
  Process.fork() { exit n }
}
p ret = Process.waitall
p ret[-1][1]  , ret[-1][1].type 
p $?          , $?.type
=> [[5245, 256], [5244, 0], [5243, 512]]
   512
   Process::Status
   512
   Process::Status
Process.waitpid(pid[, flags])
Process.waitpid2(pid[, flags])

pid で指定される特定の子プロセスの終了を待ち、そのプロセスが 終了した時に pid を返します。子プロセスが存在しなければ例外 Errno::ECHILD が発生します。

flags には、Process モジュールの定数 WNOHANG(ノンブロッキングモード)と WUNTRACED の論理和を指定します。省略したときの値は 0 です。

ノンブロッキングモードで子プロセスがまだ終了していない時には nil を返します。waitpid(2)wait4(2) の実装されていないマシンでは flags はいつも nil または 0 を指定する必要があります。

waitpid2 は、その戻り値が pid と $? の配列 である点だけが異なります。

ruby 1.7 feature: version 1.7 からは $?Process::Status オブジェクト です。

定数:

PRIO_PROCESS

Process.getpriority または Process.setpriority のプロセスプライオリティ指定。

PRIO_PGRP

プロセスグループプライオリティ。

PRIO_USER

ユーザプライオリティ。

WNOHANG

Process#waitpid の第二引数に指定するフラグで す。終了した子プロセスがない時に waitpid がブロックしません。

WUNTRACED

Process#waitpid の第二引数に指定するフラグで す。子プロセスの停止によりステータスを報告していない子プロセスがあ る時に waitpid がブロックしません。

内部クラス:

Status ((<ruby 1.7 feature>))

プロセスの終了ステータスを表現するクラスです。 Process::Status を参照してください。


*1あらい 2002-01-14: 1.6.7 までは、getpgid() は例外を発生させていません p Process.getpgid(1000000) # => -1
*2なお、Windows (mswin32, mingw32)では、INT ILL FPE SEGV TERM BREAK ABRT しか指定できません。ruby 1.7 feature KILL も指定できます